PRIMED Workflow for Group-Based Review

Author

Mikkel H. Vembye

Published

September 25, 2025

Introduction

This document contains the preliminary data analysis for the meta-analyses with dependent effects (PRIMED) in (Dalgaard et al. 2025). As we conduct separate analyses for reintegration (primary analysis) and mental health (secondary analysis) outcomes, we have divided the tabulation and visualization according to the two types of effect size estimates. In most cases, the main presentation of reintegration outcome data appears in the center column of the document, while the presentation of the mental health outcome data is shown in the right column. Where larger tables or visualizations are required, we have used tabsets to distinguish between reintegration and mental health analyses. To view the mental health presentation, select the ‘Mental health’ tab. To find the mental helath presentation, press on the ‘Mental health’ tab. In a few instances, reintegration and mental health outcomes are tabulated and visualized together to provide an overall view of the relationships between these two types of estimates. All packages that we have used to create this document, can be found in the next section.

Dalgaard, Nina T, Jakob K Jensen, Jasmin S Adada, Maya C Flensborg Jensen, Elizabeth Bengtsen, and Mikkel H Vembye. 2025. Group-based community interventions to support the social reintegration of marginalized adults with mental illness: A systematic review and meta-analysis.” Campbell Systematic Reviews.

R packages

Below, we present the R package we use in this document. For exact R package versions, see the Session Information at the bottom of this document.

# Load packages -----------------------------------------------------------
library(knitr)
library(kableExtra)
library(skimr)
library(janitor)
library(tidyverse)
library(tidyr)
library(metafor)
library(clubSandwich)
library(fastDummies)  
library(ggrepel)
library(ggExtra)
library(ggridges)
library(MetBrewer)
library(GGally)
library(igraph)
library(fastDummies)
library(patchwork)
library(ggh4x)

Data manipulation - prepare data sets

In the following section, we create all the variables that are used in the main analyses of the review. Unfold the below code to see this exact manipulations.

Loading data

Show the code
# Loading the needed data for analysis
group_based_dat <- readRDS("Group-based interventions data.RDS") |> 
  # The post-measurement of Empowerment Scale seems flawed for the study by 
  # Barbic et al. 2009 we therefore we exclude it from the analysis
  filter(!(authors == "Barbic et al." & test_name == "The Empowerment Scale")) |> 
  mutate(
    author_year = paste(authors, year),
    study = paste(authors, year),
    study = stringi::stri_trans_general(study, "Latin-ASCII"),
    study = fct_relevel(study, sort)
  ) |> 
 # Remove unused outcomes
 filter(!str_detect(analysis_plan, "Unused"))

Main variable manipulation

Unfold the below code, to find the primary data manipulation for the overall data, including both all reintegrational as well as mental health outcomes.

Show the code
gb_dat <- 
  group_based_dat |> 
  # Exclude the two binary outcomes
  filter(variable_type != "Binary") |>
  mutate(
    es_id = 1:n(),
    esid = es_id,
    
    # Main covariate adjusted effect cluster adjusted 
    gt_pop = if_else(!is.na(gt_post), gt_post, NA_real_),
    gt_pop = if_else(!is.na(gt_DD), gt_DD, gt_pop),
    gt_pop = if_else(!is.na(gt_adj), gt_adj, gt_pop),
    gt_pop = if_else(!is.na(gt_reg), gt_reg, gt_pop),
    gt_pop = if_else(!is.na(gt_DD_pop), gt_DD_pop, gt_pop),
    gt_pop = if_else(!is.na(gt_adj_pop), gt_adj_pop, gt_pop),
    
    vgt_pop = if_else(!is.na(vgt_post), vgt_post, NA_real_),
    vgt_pop = if_else(!is.na(vgt_DD), vgt_DD, vgt_pop),
    vgt_pop = if_else(!is.na(vgt_adj), vgt_adj, vgt_pop),
    vgt_pop = if_else(!is.na(vgt_reg), vgt_reg, vgt_pop),
    vgt_pop = if_else(!is.na(vgt_DD_pop), vgt_DD_pop, vgt_pop),
    vgt_pop = if_else(!is.na(vgt_adj_pop), vgt_adj_pop, vgt_pop),
    
    Wgt_pop = if_else(!is.na(Wgt_post), Wgt_post, NA_real_),
    Wgt_pop = if_else(!is.na(Wgt_DD), Wgt_DD, Wgt_pop),
    Wgt_pop = if_else(!is.na(Wgt_adj), Wgt_adj, Wgt_pop),
    Wgt_pop = if_else(!is.na(Wgt_reg), Wgt_reg, Wgt_pop),
    Wgt_pop = if_else(!is.na(Wgt_DD_pop), Wgt_DD_pop, Wgt_pop),
    Wgt_pop = if_else(!is.na(Wgt_adj_pop), Wgt_adj_pop, Wgt_pop),
    
    # Main covariate adjusted effect cluster adjusted 
    gt = if_else(!is.na(gt_post), gt_post, NA_real_),
    gt = if_else(!is.na(gt_DD), gt_DD, gt),
    gt = if_else(!is.na(gt_adj), gt_adj, gt),
    gt = if_else(!is.na(gt_reg), gt_reg, gt),
    
    vgt = if_else(!is.na(vgt_post), vgt_post, NA_real_),
    vgt = if_else(!is.na(vgt_DD), vgt_DD, vgt),
    vgt = if_else(!is.na(vgt_adj), vgt_adj, vgt),
    vgt = if_else(!is.na(vgt_reg), vgt_reg, vgt),
    
    Wgt = if_else(!is.na(Wgt_post), Wgt_post, NA_real_),
    Wgt = if_else(!is.na(Wgt_DD), Wgt_DD, Wgt),
    Wgt = if_else(!is.na(Wgt_adj), Wgt_adj, Wgt),
    Wgt = if_else(!is.na(Wgt_reg), Wgt_reg, Wgt),
    
    # Hedges g posttest only, adjusted for clustering
    # Imputing covariate-adjusted estimate when posttest calculation was not possible
    gt_post = if_else(is.na(gt_post) & !is.na(gt_reg), gt_reg, gt_post),
    gt_post = if_else(is.na(gt_post) & !is.na(gt_adj), gt_adj, gt_post),
    gt_post = if_else(is.na(gt_post) & !is.na(gt_DD), gt_DD, gt_post),
    
    vgt_post = if_else(is.na(vgt_post) & !is.na(vgt_reg), vgt_reg, vgt_post),
    vgt_post = if_else(is.na(vgt_post) & !is.na(vgt_adj), vgt_adj, vgt_post),
    vgt_post = if_else(is.na(vgt_post) & !is.na(vgt_DD), vgt_DD, vgt_post),
    
    Wgt_post = if_else(is.na(Wgt_post) & !is.na(Wgt_reg), Wgt_reg, Wgt_post),
    Wgt_post = if_else(is.na(Wgt_post) & !is.na(Wgt_adj), Wgt_adj, Wgt_post),
    Wgt_post = if_else(is.na(Wgt_post) & !is.na(Wgt_DD), Wgt_DD, Wgt_post),
    
    # Hedges' g posttest only, not-adjusted for clustering
    # Imputing covariate-adjusted estimate when posttest calculation was not possible
    g_post = if_else(is.na(g_post) & !is.na(g_reg), g_reg, g_post),
    g_post = if_else(is.na(g_post) & !is.na(g_adj), g_adj, g_post),
    g_post = if_else(is.na(g_post) & !is.na(g_DD), g_DD, g_post),
    
    vg_post = if_else(is.na(vg_post) & !is.na(vg_reg), vg_reg, vg_post),
    vg_post = if_else(is.na(vg_post) & !is.na(vg_adj), vg_adj, vg_post),
    vg_post = if_else(is.na(vg_post) & !is.na(vg_DD), vg_DD, vg_post),
    
    Wg_post = if_else(is.na(Wg_post) & !is.na(Wg_reg), Wg_reg, Wg_post),
    Wg_post = if_else(is.na(Wg_post) & !is.na(Wg_adj), Wg_adj, Wg_post),
    Wg_post = if_else(is.na(Wg_post) & !is.na(Wg_DD), Wg_DD, Wg_post),
    
    # Cohen's d posttest only, not-adjusted for clustering
    # Imputing covariate-adjusted estimate when posttest calculation was not possible
    d_post = if_else(is.na(d_post) & !is.na(d_reg), d_reg, d_post),
    d_post = if_else(is.na(d_post) & !is.na(d_adj), d_adj, d_post),
    d_post = if_else(is.na(d_post) & !is.na(d_DD), d_DD, d_post),
    
    vd_post = if_else(is.na(vd_post) & !is.na(vd_reg), vd_reg, vd_post),
    vd_post = if_else(is.na(vd_post) & !is.na(vd_adj), vd_adj, vd_post),
    vd_post = if_else(is.na(vd_post) & !is.na(vd_DD), vd_DD, vd_post),
    
    Wd_post = if_else(is.na(Wd_post) & !is.na(Wd_reg), Wd_reg, Wd_post),
    Wd_post = if_else(is.na(Wd_post) & !is.na(Wd_adj), Wd_adj, Wd_post),
    Wd_post = if_else(is.na(Wd_post) & !is.na(Wd_DD), Wd_DD, Wd_post),
    
    
    # Covariate adjusted Hedges' g, not cluster adjusted 
    g = if_else(!is.na(g_post), g_post, NA_real_),
    g = if_else(!is.na(g_DD), g_DD, g),
    g = if_else(!is.na(g_adj), g_adj, g),
    g = if_else(!is.na(g_reg), g_reg, g),
    
    vg = if_else(!is.na(vg_post), vg_post, NA_real_),
    vg = if_else(!is.na(vg_DD), vg_DD, vg),
    vg = if_else(!is.na(vg_adj), vg_adj, vg),
    vg = if_else(!is.na(vg_reg), vg_reg, vg),
    
    Wg = if_else(!is.na(Wg_post), Wg_post, NA_real_),
    Wg = if_else(!is.na(Wg_DD), Wg_DD, Wg),
    Wg = if_else(!is.na(Wg_adj), Wg_adj, Wg),
    Wg = if_else(!is.na(Wg_reg), Wg_reg, Wg),
    
    # Covariate-adjusted version of Cohen's d, neither cluster nor small sample adjusted
    d = if_else(!is.na(d_post), d_post, NA_real_),
    d = if_else(!is.na(d_DD), d_DD, d),
    d = if_else(!is.na(d_adj), d_adj, d),
    d = if_else(!is.na(d_reg), d_reg, d),
    
    vd = if_else(!is.na(vd_post), vd_post, NA_real_),
    vd = if_else(!is.na(vd_DD), vd_DD, vd),
    vd = if_else(!is.na(vd_adj), vd_adj, vd),
    vd = if_else(!is.na(vd_reg), vd_reg, vd),
    
    Wd = if_else(!is.na(Wd_post), Wd_post, NA_real_),
    Wd = if_else(!is.na(Wd_DD), Wd_DD, Wd),
    Wd = if_else(!is.na(Wd_adj), Wd_adj, Wd),
    Wd = if_else(!is.na(Wd_reg), Wd_reg, Wd),
    
    inv_sample_size = (1/N_t + 1/N_c),
    
    posttest_only = if_else(ppcor_method == "Posttest only", "Posttest only ES", "Pre-posttest adj. ES", missing = "Pre-posttest adj. ES"),
    
    # ESS = round(4/vgt), # Using cluster bias corrected sampling variance
    
    studyid = if_else(authors == "Gonzalez & Prihoda", 500, studyid), 
    
    trt_id = if_else(str_detect(study, "Schaf") & trt_name == "Relapse Prevention Training", 2, trt_id),
    
    cnt = if_else(cnt == "USA", "US", cnt),
    
    design = if_else(design  == "QES-pretest", "QES", design),
    
    # MHV: Jeg synes ikke det er en god ide at ændre CRCT til RCT. Jeg vil gerne kunne se forskel.  
    # design = ifelse(design  == "CRCT", "RCT", design), 
    
    assessment = if_else(assessment == "Self  assesment", "Self assesment", assessment),
    
    randomization = if_else(randomization == "Simple Block Randomization", "Block randomized",
                            randomization),
    randomization = if_else(randomization == "Simple with permuted blocks, stratified by site",
                            "Stratified randomization", randomization),
    
    randomization = if_else(randomization == "Stratified?",
                            "Stratified randomization", randomization),
    
    randomization = if_else(is.na(randomization) & studyid == 102, 
                            "Stratified randomization", randomization),
    
    randomization = if_else(randomization == "Ratio and block randomized",
                            "Block randomized", randomization),
    
    randomization = if_else(randomization == "Block randomized stratified by site",
                            "Block randomized", randomization),
    
    randomization = if_else(randomization == "Resticted and adapted randomization (i.e. minimization)",
                            "Stratified randomization", randomization),
    
    randomization = if_else(randomization == "Unequal simple randomization",
                            "Block randomized", randomization),
    
    randomization = if_else(randomization == "Within-site basis and unequal allocation ratio",
                            "Stratified randomization", randomization),
    
    trt_type = if_else(trt_type == "Group-based  Cognitive Behavioral Therapy", 
                       "Group based Cognitive Behavioural Therapy", trt_type),
    trt_type = if_else(trt_type == "Group-based Cognitive Behavioral Therapy", 
                       "Group based Cognitive Behavioural Therapy", trt_type),
    trt_type = if_else(trt_type =="Group psychoeducation & Social skill training", 
                       "Group psychoeducation & Social Skill Training", trt_type),
    trt_type = if_else(trt_type =="Group psychoeducation", 
                       "Group Psychoeducation", trt_type),
    trt_type = if_else(trt_type =="Group psychoeducation & Social Skill Training", 
                       "Group Psychoeducation & Social Skill Training", trt_type),
    trt_type = if_else(trt_type =="Education and Illness Management", 
                       "Group Psychoeducation & Social Skill Training", trt_type),
    trt_type = if_else(trt_type =="Illness management", 
                       "Illness Management", trt_type),
    
    sample_factors = if_else(sample_factors =="Older with depression and anxiety", 
                             "Mixed", sample_factors), 
    sample_factors = if_else(sample_factors =="All suffered from severe mental illness", 
                             "Shared Social problem(s)/challenge(s)", sample_factors),
    sample_factors = if_else(sample_factors =="Shared origin and psychological distress", 
                             "Mixed", sample_factors),
    sample_factors = if_else(sample_factors =="persons with major psychiatric problems", 
                             "Shared Social problem(s)/challenge(s)", sample_factors),
    
    analysis_plan = if_else(analysis_plan == "Unused", "Unused outcomes", analysis_plan), 
    analysis_plan = case_match(
      analysis_plan,
      "Hope, Empowerment & Self-efficacy" ~ "Hope, empowerment & self-efficacy",
      "Wellbeing and Quality of Life" ~ "Wellbeing and quality of life",
      "All mental health outcomes" ~ "General mental health",
      "All mental health outcomes/Anxiety" ~ "Anxiety",
      "All mental health outcomes/Depression" ~ "Depression",
      "All mental health outcomes/Symptoms of psychosis" ~ "Symptoms of psychosis",
      "All mental health outcomes/Negative symptoms" ~ "Symptoms of psychosis",
      .default = analysis_plan
    ),
    
    test_type = if_else(test_type == "Clinical administered", "Clinician-rated measure", test_type),
    test_type = if_else(test_type == "Clinical interviews", "Clinician-rated measure", test_type),
    test_type = if_else(test_type == "Self report", "Self-reported", test_type),
    test_type = if_else(test_type == "Self report through clinical interview", "Self-reported", test_type),
    test_type = if_else(test_type == "Self-reported via diagnostic interview", "Self-reported", test_type), 
    
    measure_type = if_else(measure_type == "Pre-post with controls", "Post-intervention", measure_type),
    
    cluster_treatment = if_else(cluster_treatment == "Hierarchical mixed models", "Mixed-model", cluster_treatment),
    
    cluster_treatment = if_else(cluster_treatment == "Multilevel analysis and clustered standard errors", 
                                "Multilevel analysis", cluster_treatment),
    
    rob_tool = if_else(rob_tool == "Rob2", "RoB2", rob_tool),
    rob_tool = if_else(rob_tool == "Rob2 CRCT", "RoB2", rob_tool),
    
    analysis_strategy = if_else(str_detect(study, "Michalak"), "ITT", analysis_strategy),
    
    conventional = if_else(protocol != "Yes", 1, 0),
    # Smith et al. 2021 drew on a retropective protocol
    conventional = if_else(study == "Smith et al. 2021", 1, conventional),
    prereg_chr = if_else(conventional == 0, "Preregistered", "Not preregistered"),
    
    # For publication/selection/small study bias testing
    Wse = sqrt(Wgt),
    t_i = gt/sqrt(Wgt),
    
    ESS_t = round(N_t/(1+(avg_cl_size - 1)*0.1)),
    ESS_c = round(N_c/(1+(avg_cl_size - 1)*0.1)),
    ESS_total = round(N_total/(1+(avg_cl_size - 1)*0.1)),
    
    outcome_construct = case_match(
      analysis_plan,
      # Mental health outcomes
      c("General mental health", "Anxiety",
        "Depression", "Symptoms of psychosis") ~ "Mental health outcome",
      .default = "Reintegrational outcome"
    ),
    
    # Changing to numeric vectors
    across(c(age_mean_sample:male_pct_t, sessions_per_week), ~as.numeric(.x)),
    
    # Make weighted mean weighted by the group sample size 
    age_mean = if_else(
      is.na(age_mean_sample), 
      (age_mean_t*N_t + age_mean_c*N_c)/(N_t + N_c), 
      age_mean_sample
    ),
    
    male_pct = if_else(
      is.na(male_pct_sample),
      (male_pct_t*N_t + male_pct_c*N_c)/(N_t + N_c),
      male_pct_sample
    ),
    
    # duration_weeks has extract errors
    duration_in_weeks = time_from_baseline_weeks - time_after_end_intervention_weeks,
    total_number_of_sessions = round(sessions_per_week * duration_in_weeks),
    
    CBT_int = if_else(trt_group == "group-based CBT", "CBT", "Other"), 
    
    QES_design = if_else(design == "QES", "QES", "RCT"),
    
    overall_rob = case_match(
      Overall, 
      c("Serious", "High") ~ "Serious/High",
      c("Some concerns", "Moderate") ~ "Some concerns/Moderate",
      .default = "Low"
    ),
    
    overall_rob = factor(overall_rob, levels = c("Low", "Some concerns/Moderate", "Serious/High")),
    
    across(schizophrenia_or_primary_psychotic_disorder:dissociative_identity_disorder, ~ replace_na(.x, 0)),
    handle_multilevel = as.numeric(if_any(adj_fct_DD:adj_fct_reg, ~ grepl("gamma", .))),
    handle_multilevel = if_else(handle_multilevel == 1, "Yes", "No")
    
 ) |> 
  rowwise() |> 
  mutate(
    diagnosis = {
      col_ones <- names(
        across(.cols = schizophrenia_or_primary_psychotic_disorder:dissociative_identity_disorder)
        )[unlist(
          c_across(schizophrenia_or_primary_psychotic_disorder:dissociative_identity_disorder)
          ) == 1]
      n_ones <- length(col_ones)
      if (n_ones == 1) col_ones
      else if (n_ones > 1) "mixed"
    }
  ) |> 
  ungroup() |> 
  mutate(
    schizophrenia = if_else(str_detect(diagnosis, "schizophrenia"), "Schizophrenia", "Other")
  ) |> 
  mutate(
    # Used to remove ITT outcomes from Cano-Vindel et al. 2021 and Craigie & Nathan 2009 
    n_analysis_strategies = n_distinct(analysis_strategy),
    .by = study
  ) |> 
  # Removing ITT analyses from Cano-Vindel et al. 2021 and Craigie & Nathan 2009 
  filter(!c(str_detect(study, "Cano|Craigie|Woj") & analysis_strategy == "ITT")) 
Show the code
time_vcalc <- c(
  # Acarturk
  1,2,1,2,1,2,
  # Barbic
  1,1,1,
  # Bond
  1,1, 
  # Baekkelund, 
  1,1,2,2,
  # Cano-Vindel
  rep(c(1:4), each = 10),
  # Craigie & Nathan
  1,1,1,
  # Crawford (multi-treatment)
  rep(c(1,2), each = 2, 4),
  # Druss 2010
  1,1,
  #Druss 2018
  1,1,1,2,2,2,
  # Dyck
  1, 
  # Gestel-Timmermans
  rep(c(1,2), 5),
  # Gatz
  rep(1,5),
  # Gonzalaez
  rep(1,2),
  # Gordon 
  rep(1,4),
  # Gutman
  rep(1,2),
  # Hagen
  rep(1,4),
  # Haslem
  rep(1,3),
  # Hilden
  rep(1,7),
  # Himle
  rep(c(1,2), each = 6),
  #Jacob
  rep(c(1,2), each = 5),
  #James
  rep(1,5),
  # Kanie
  rep(1,4),
  # Lim
  rep(1,6),
  # Llyod-Evans
  rep(1,4),
  # Madigan
  rep(c(1,2), each = 6),
  # McCay 2006
  rep(1,4),
  # McCay 2007
  rep(1,3),
  # Michalak (multi-treatment)
  rep(1,14),
  # Morley 
  rep(1,4),
  # Morton
  rep(1,5),
  # Patterson
  rep(c(1,2), each = 5),
  # Popolo
  rep(1,2),
  # Rabenstein
  rep(1,3),
  # Rosenblum 
  rep(1,4),
  # Russinova 
  rep(c(1,2), each = 5),
  # Rusch
  rep(c(1,2), each = 6),
  # Sacks
  rep(1,5),
  # Sajatovic
  rep(c(1:3), each = 3),
  # Saloheimo
  1, 
  # Schrank
  rep(1,6),
  # Schafer (multi-treatment)
  rep(c(2,3,1), each = 2, 6),
  # Somers
  rep(1,5),
  # Tjaden
  rep(c(1,2), each = 4),
  # Valiente 
  rep(1,16),
  # Volpe
  rep(1,4),
  # Wojtalik 
  rep(1,2),
  #Wuthrich
  rep(1,4),
  # Smith 
  rep(1,3)
) 

gb_dat$time <- time_vcalc

Creating primary and secondary data

Below, we separate the data by reintegrational (primary analysis) and mental health outcomes (secondary analyses)

A general overview of the main data, we use for analyses of reintegrational outcomes can be found in the scroll box below.

Show the code
reintegration_dat <- 
  gb_dat |> 
  filter(outcome_construct == "Reintegrational outcome") 

saveRDS(reintegration_dat, file = "reintegration_dat.rds")

reint_overview <- 
  reintegration_dat |> 
  select(
    study, eppi_id, esid, N_t, N_c, N_total, inv_sample_size, gt_pop, vgt_pop, Wgt_pop, gt, vgt, Wgt, Wse, 
    prereg_chr, conventional, analysis_plan, Overall, D5, D7, timing
  )

reint_overview |> 
  mutate(
    p_val = 2 * ( 1 - pnorm( abs(gt_pop) / sqrt(vgt_pop) ) )
  ) |> 
  select(
    `Authors (year)` = study, N_t, N_c,
    `Outcome construct` = analysis_plan, gt_pop, vgt_pop, Wgt, Wse, p_val, 
    `No protocol` = conventional, `Overall RoB` = Overall
  ) |> 
  kable(digits=3)  |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "600px", fixed_thead = TRUE)
Table 1: Data with reintegration outcomes.
Authors (year) N_t N_c Outcome construct gt_pop vgt_pop Wgt Wse p_val No protocol Overall RoB
Acarturk et al. 2022 24 22 Wellbeing and quality of life 0.314 0.196 0.195 0.442 0.478 0 Some concerns
Acarturk et al. 2022 24 22 Wellbeing and quality of life -0.103 0.091 0.091 0.301 0.733 0 High
Barbic et al. 2009 16 17 Hope, empowerment & self-efficacy 0.443 0.162 0.159 0.399 0.272 1 Some concerns
Barbic et al. 2009 16 17 Wellbeing and quality of life -0.069 0.159 0.159 0.399 0.863 1 Some concerns
Barbic et al. 2009 16 17 Hope, empowerment & self-efficacy 0.548 0.164 0.159 0.399 0.176 1 Some concerns
Bond et al. 2015 43 42 Hope, empowerment & self-efficacy 0.000 0.094 0.094 0.306 1.000 1 Some concerns
Bond et al. 2015 43 41 Psychiatric hospitalization 0.309 0.095 0.094 0.307 0.316 1 Some concerns
Baekkelund et al. 2022 29 30 Social functioning (degree of impairment) -0.082 0.078 0.082 0.286 0.769 0 Low
Baekkelund et al. 2022 29 30 Social functioning (degree of impairment) 0.142 0.084 0.088 0.297 0.624 0 Low
Cano-Vindel et al. 2021 315 316 Social functioning (degree of impairment) 0.259 0.006 0.006 0.080 0.001 0 Low
Cano-Vindel et al. 2021 315 316 Social functioning (degree of impairment) 0.428 0.005 0.005 0.072 0.000 0 Low
Cano-Vindel et al. 2021 315 316 Social functioning (degree of impairment) 0.439 0.007 0.007 0.082 0.000 0 Low
Cano-Vindel et al. 2021 315 316 Wellbeing and quality of life 0.565 0.006 0.006 0.076 0.000 0 Low
Cano-Vindel et al. 2021 315 316 Wellbeing and quality of life 0.593 0.005 0.005 0.069 0.000 0 Low
Cano-Vindel et al. 2021 315 316 Wellbeing and quality of life 0.305 0.005 0.005 0.069 0.000 0 Low
Cano-Vindel et al. 2021 315 316 Wellbeing and quality of life 0.389 0.007 0.007 0.083 0.000 0 Low
Cano-Vindel et al. 2021 273 238 Social functioning (degree of impairment) 0.066 0.008 0.008 0.088 0.450 0 Low
Cano-Vindel et al. 2021 273 238 Social functioning (degree of impairment) 0.128 0.006 0.006 0.079 0.105 0 Low
Cano-Vindel et al. 2021 273 238 Social functioning (degree of impairment) 0.224 0.008 0.008 0.090 0.013 0 Low
Cano-Vindel et al. 2021 273 238 Wellbeing and quality of life 0.301 0.007 0.007 0.083 0.000 0 Low
Cano-Vindel et al. 2021 273 238 Wellbeing and quality of life 0.308 0.006 0.006 0.076 0.000 0 Low
Cano-Vindel et al. 2021 273 238 Wellbeing and quality of life 0.211 0.006 0.006 0.076 0.005 0 Low
Cano-Vindel et al. 2021 273 238 Wellbeing and quality of life 0.194 0.008 0.008 0.091 0.033 0 Low
Cano-Vindel et al. 2021 229 204 Social functioning (degree of impairment) 0.342 0.009 0.009 0.095 0.000 0 Low
Cano-Vindel et al. 2021 229 204 Social functioning (degree of impairment) 0.357 0.008 0.007 0.086 0.000 0 Low
Cano-Vindel et al. 2021 229 204 Social functioning (degree of impairment) 0.403 0.010 0.010 0.098 0.000 0 Low
Cano-Vindel et al. 2021 229 204 Wellbeing and quality of life 0.381 0.008 0.008 0.091 0.000 0 Low
Cano-Vindel et al. 2021 229 204 Wellbeing and quality of life 0.232 0.007 0.007 0.082 0.005 0 Low
Cano-Vindel et al. 2021 229 204 Wellbeing and quality of life 0.083 0.007 0.007 0.082 0.313 0 Low
Cano-Vindel et al. 2021 229 204 Wellbeing and quality of life 0.179 0.010 0.010 0.099 0.072 0 Low
Cano-Vindel et al. 2021 208 180 Social functioning (degree of impairment) 0.455 0.010 0.010 0.101 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Social functioning (degree of impairment) 0.457 0.008 0.008 0.091 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Social functioning (degree of impairment) 0.512 0.011 0.011 0.103 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Wellbeing and quality of life 0.598 0.010 0.009 0.096 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Wellbeing and quality of life 0.410 0.008 0.008 0.087 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Wellbeing and quality of life 0.281 0.008 0.008 0.087 0.001 0 Low
Cano-Vindel et al. 2021 208 180 Wellbeing and quality of life 0.245 0.011 0.011 0.105 0.020 0 Low
Craigie & Nathan 2009 157 77 Wellbeing and quality of life -0.247 0.026 0.026 0.162 0.129 1 Serious
Crawford et al. 2012 121 121 Social functioning (degree of impairment) -0.022 0.024 0.025 0.159 0.885 0 Low
Crawford et al. 2012 119 121 Social functioning (degree of impairment) -0.052 0.024 0.026 0.160 0.739 0 Low
Crawford et al. 2012 121 117 Social functioning (degree of impairment) -0.039 0.019 0.020 0.141 0.779 0 Low
Crawford et al. 2012 117 117 Social functioning (degree of impairment) -0.085 0.019 0.020 0.142 0.542 0 Low
Crawford et al. 2012 121 121 Social functioning (degree of impairment) -0.265 0.022 0.021 0.147 0.071 0 Low
Crawford et al. 2012 119 121 Social functioning (degree of impairment) -0.137 0.022 0.022 0.147 0.352 0 Low
Crawford et al. 2012 121 117 Social functioning (degree of impairment) -0.209 0.022 0.022 0.147 0.158 0 Low
Crawford et al. 2012 117 117 Social functioning (degree of impairment) -0.081 0.022 0.022 0.149 0.588 0 Low
Crawford et al. 2012 121 121 Wellbeing and quality of life 0.203 0.022 0.021 0.147 0.168 0 Low
Crawford et al. 2012 119 121 Wellbeing and quality of life 0.074 0.022 0.022 0.147 0.616 0 Low
Crawford et al. 2012 121 117 Wellbeing and quality of life 0.177 0.022 0.022 0.147 0.229 0 Low
Crawford et al. 2012 117 117 Wellbeing and quality of life 0.166 0.022 0.022 0.149 0.266 0 Low
Druss et al. 2010 41 39 Wellbeing and quality of life 0.207 0.065 0.065 0.254 0.417 0 High
Druss et al. 2010 41 39 Wellbeing and quality of life 0.035 0.065 0.065 0.254 0.890 0 High
Druss et al. 2018 198 202 Hope, empowerment & self-efficacy 0.204 0.013 0.013 0.114 0.074 0 Some concerns
Druss et al. 2018 198 202 Wellbeing and quality of life 0.055 0.013 0.013 0.114 0.630 0 Some concerns
Druss et al. 2018 198 202 Wellbeing and quality of life 0.019 0.013 0.013 0.114 0.866 0 Some concerns
Druss et al. 2018 198 202 Hope, empowerment & self-efficacy 0.113 0.013 0.013 0.114 0.321 0 Some concerns
Druss et al. 2018 198 202 Wellbeing and quality of life 0.102 0.013 0.013 0.114 0.373 0 Some concerns
Druss et al. 2018 198 202 Wellbeing and quality of life 0.169 0.013 0.013 0.114 0.140 0 Some concerns
Gestel-Timmermans et al. 2012 136 117 Hope, empowerment & self-efficacy 0.193 0.014 0.014 0.118 0.103 0 High
Gestel-Timmermans et al. 2012 121 99 Hope, empowerment & self-efficacy 0.156 0.014 0.014 0.120 0.192 0 High
Gestel-Timmermans et al. 2012 132 118 Hope, empowerment & self-efficacy 0.122 0.014 0.014 0.117 0.298 0 High
Gestel-Timmermans et al. 2012 120 97 Hope, empowerment & self-efficacy 0.348 0.017 0.017 0.129 0.008 0 High
Gestel-Timmermans et al. 2012 138 122 Loneliness -0.196 0.014 0.014 0.116 0.093 0 High
Gestel-Timmermans et al. 2012 125 102 Loneliness -0.039 0.014 0.014 0.117 0.740 0 High
Gestel-Timmermans et al. 2012 124 114 Wellbeing and quality of life -0.045 0.011 0.011 0.106 0.675 0 High
Gestel-Timmermans et al. 2012 111 97 Wellbeing and quality of life -0.039 0.012 0.012 0.111 0.727 0 High
Gatz et al. 2007 136 177 Alcohol and drug abuse/misuse 0.094 0.023 0.022 0.150 0.531 1 Serious
Gatz et al. 2007 135 176 Alcohol and drug abuse/misuse 0.204 0.046 0.046 0.214 0.341 1 Serious
Gatz et al. 2007 134 173 Hope, empowerment & self-efficacy 0.241 0.019 0.019 0.138 0.082 1 Serious
Gonzalez & Prihoda 2007 8 9 Social functioning (degree of impairment) 0.206 0.287 0.189 0.434 0.701 1 Serious
Gordon et al. 2018 21 15 Wellbeing and quality of life 0.258 0.142 0.141 0.375 0.494 1 Some concerns
Gordon et al. 2018 21 15 Social functioning (degree of impairment) -0.388 0.143 0.141 0.375 0.305 1 Some concerns
Gordon et al. 2018 21 15 Social functioning (degree of impairment) 0.183 0.141 0.141 0.375 0.627 1 Some concerns
Gutman et al. 2019 10 10 Wellbeing and quality of life 0.501 0.033 0.026 0.162 0.006 1 Serious
Hagen et al. 2005 14 17 Social functioning (degree of impairment) -0.039 0.174 0.174 0.418 0.925 1 High
Haslam et al. 2019 66 54 Loneliness -0.246 0.006 0.005 0.073 0.001 0 High
Hilden et al. 2021 23 12 Physical health 0.189 0.138 0.140 0.375 0.612 0 High
Hilden et al. 2021 23 12 Alcohol and drug abuse/misuse 0.070 0.140 0.140 0.375 0.852 0 High
Hilden et al. 2021 23 12 Social functioning (degree of impairment) -0.283 0.142 0.140 0.375 0.452 0 High
Hilden et al. 2021 23 12 Social functioning (degree of impairment) 0.434 0.143 0.140 0.375 0.252 0 High
Hilden et al. 2021 23 12 Social functioning (degree of impairment) 0.036 0.140 0.140 0.375 0.924 0 High
Himle et al. 2014 29 29 Physical health 0.507 0.083 0.083 0.288 0.079 0 Some concerns
Himle et al. 2014 29 29 Social functioning (degree of impairment) 0.464 0.085 0.083 0.288 0.111 0 Some concerns
Himle et al. 2014 29 29 Physical health 0.523 0.083 0.083 0.288 0.070 0 Some concerns
Himle et al. 2014 29 29 Social functioning (degree of impairment) 0.819 0.089 0.083 0.288 0.006 0 Some concerns
Jacob et al. 2010 19 24 Self-esteem 0.495 0.120 0.116 0.341 0.152 1 Serious
Jacob et al. 2010 19 24 Self-esteem 0.442 0.119 0.116 0.341 0.200 1 Serious
Jacob et al. 2010 19 24 Self-esteem 0.133 0.117 0.116 0.341 0.697 1 Serious
Jacob et al. 2010 19 24 Self-esteem 0.053 0.116 0.116 0.341 0.876 1 Serious
Jacob et al. 2010 19 24 Self-esteem 0.392 0.118 0.116 0.341 0.255 1 Serious
Jacob et al. 2010 19 24 Self-esteem 0.433 0.119 0.116 0.341 0.209 1 Serious
Jacob et al. 2010 19 24 Self-esteem 0.222 0.117 0.116 0.341 0.516 1 Serious
Jacob et al. 2010 19 24 Self-esteem -0.121 0.117 0.116 0.341 0.724 1 Serious
James et al. 2004 29 29 Alcohol and drug abuse/misuse 1.120 0.094 0.083 0.288 0.000 1 Some concerns
James et al. 2004 29 29 Alcohol and drug abuse/misuse 0.281 0.083 0.083 0.288 0.331 1 Some concerns
James et al. 2004 28 29 Alcohol and drug abuse/misuse 0.538 0.087 0.085 0.291 0.069 1 Some concerns
Kanie et al. 2019 32 29 Social functioning (degree of impairment) -0.177 0.075 0.078 0.279 0.517 0 Low
Kanie et al. 2019 32 29 Social functioning (degree of impairment) 0.037 0.078 0.078 0.279 0.896 0 Low
Lim et al. 2020 18 21 Wellbeing and quality of life 0.862 0.148 0.137 0.371 0.025 1 Serious
Lloyd-Evans et al. 2020 25 10 Loneliness 0.103 0.158 0.158 0.398 0.796 0 Low
Lloyd-Evans et al. 2020 25 10 Wellbeing and quality of life 0.214 0.159 0.158 0.398 0.591 0 Low
Madigan et al. 2013 36 18 Alcohol and drug abuse/misuse 0.024 0.097 0.097 0.312 0.940 1 Some concerns
Madigan et al. 2013 39 19 Social functioning (degree of impairment) 0.038 0.087 0.091 0.302 0.898 1 Some concerns
Madigan et al. 2013 34 15 Wellbeing and quality of life 0.490 0.113 0.110 0.332 0.144 1 Some concerns
Madigan et al. 2013 28 14 Alcohol and drug abuse/misuse 0.049 0.125 0.125 0.354 0.891 1 Some concerns
Madigan et al. 2013 31 16 Social functioning (degree of impairment) 0.008 0.106 0.111 0.333 0.982 1 Some concerns
Madigan et al. 2013 34 14 Wellbeing and quality of life 0.677 0.119 0.114 0.338 0.050 1 Some concerns
McCay et al. 2006 26 14 Self-esteem 0.521 0.052 0.048 0.219 0.022 1 Serious
McCay et al. 2006 26 14 Wellbeing and quality of life 0.129 0.109 0.108 0.329 0.694 1 Serious
McCay et al. 2007 29 18 Self-esteem 0.386 0.018 0.016 0.128 0.004 1 High
McCay et al. 2007 29 18 Wellbeing and quality of life 0.509 0.019 0.016 0.126 0.000 1 High
McCay et al. 2007 29 18 Hope, empowerment & self-efficacy 0.400 0.021 0.019 0.137 0.005 1 High
Michalak et al. 2015 36 35 Wellbeing and quality of life 0.299 0.055 0.054 0.233 0.203 0 Some concerns
Michalak et al. 2015 35 35 Wellbeing and quality of life 0.349 0.033 0.032 0.180 0.056 0 Some concerns
Michalak et al. 2015 36 35 Wellbeing and quality of life 0.115 0.032 0.031 0.177 0.519 0 Some concerns
Michalak et al. 2015 35 35 Wellbeing and quality of life 0.329 0.037 0.036 0.190 0.087 0 Some concerns
Michalak et al. 2015 36 35 Wellbeing and quality of life 0.472 0.054 0.052 0.229 0.043 0 Some concerns
Michalak et al. 2015 35 35 Wellbeing and quality of life 0.410 0.044 0.043 0.207 0.052 0 Some concerns
Michalak et al. 2015 36 35 Wellbeing and quality of life 0.134 0.039 0.038 0.196 0.495 0 Some concerns
Michalak et al. 2015 35 35 Wellbeing and quality of life 0.270 0.035 0.035 0.186 0.151 0 Some concerns
Michalak et al. 2015 36 35 Social functioning (degree of impairment) 0.567 0.055 0.052 0.229 0.015 0 Some concerns
Michalak et al. 2015 35 35 Social functioning (degree of impairment) 0.389 0.045 0.044 0.209 0.066 0 Some concerns
Morley et al. 2014 122 63 Hope, empowerment & self-efficacy 0.296 0.028 0.027 0.166 0.075 1 Some concerns
Morton et al. 2012 21 20 Hope, empowerment & self-efficacy 0.985 0.091 0.078 0.279 0.001 1 Some concerns
Patterson et al. 2003 16 16 Wellbeing and quality of life 0.109 0.163 0.162 0.403 0.788 1 Some concerns
Patterson et al. 2003 16 16 Wellbeing and quality of life -0.268 0.164 0.162 0.403 0.508 1 Some concerns
Rabenstein et al. 2016 153 148 Wellbeing and quality of life 0.415 0.018 0.018 0.133 0.002 1 Moderate
Rosenblum et al. 2014 91 70 Alcohol and drug abuse/misuse 0.129 0.032 0.032 0.178 0.468 0 Some concerns
Rosenblum et al. 2014 91 70 Alcohol and drug abuse/misuse 0.325 0.032 0.032 0.178 0.069 0 Some concerns
Rosenblum et al. 2014 91 70 Alcohol and drug abuse/misuse 0.168 0.032 0.032 0.178 0.345 0 Some concerns
Rosenblum et al. 2014 91 70 Alcohol and drug abuse/misuse 0.178 0.032 0.032 0.178 0.318 0 Some concerns
Russinova et al. 2018 22 26 Hope, empowerment & self-efficacy 0.131 0.112 0.112 0.334 0.696 1 Some concerns
Russinova et al. 2018 22 26 Self-esteem 0.716 0.118 0.112 0.334 0.037 1 Some concerns
Russinova et al. 2018 22 26 Hope, empowerment & self-efficacy 0.101 0.112 0.112 0.334 0.762 1 Some concerns
Russinova et al. 2018 22 26 Employment 0.296 0.113 0.112 0.334 0.378 1 Some concerns
Russinova et al. 2018 21 24 Hope, empowerment & self-efficacy -0.117 0.119 0.118 0.344 0.733 1 Some concerns
Russinova et al. 2018 22 25 Hope, empowerment & self-efficacy 0.181 0.114 0.113 0.337 0.591 1 Some concerns
Russinova et al. 2018 22 25 Self-esteem 0.225 0.114 0.113 0.337 0.505 1 Some concerns
Russinova et al. 2018 22 25 Hope, empowerment & self-efficacy -0.113 0.113 0.113 0.337 0.737 1 Some concerns
Russinova et al. 2018 22 25 Employment 0.030 0.113 0.113 0.337 0.930 1 Some concerns
Russinova et al. 2018 21 24 Hope, empowerment & self-efficacy 0.000 0.118 0.118 0.344 1.000 1 Some concerns
Rusch et al. 2019 18 17 Hope, empowerment & self-efficacy 0.333 0.104 0.102 0.319 0.301 0 Some concerns
Rusch et al. 2019 18 17 Hope, empowerment & self-efficacy -0.094 0.057 0.057 0.239 0.694 0 Some concerns
Rusch et al. 2019 18 17 Hope, empowerment & self-efficacy 0.650 0.125 0.118 0.344 0.066 0 Some concerns
Rusch et al. 2019 18 17 Self-esteem 0.511 0.035 0.031 0.177 0.006 0 Some concerns
Rusch et al. 2019 18 17 Hope, empowerment & self-efficacy 0.522 0.107 0.103 0.321 0.111 0 Some concerns
Rusch et al. 2019 20 13 Hope, empowerment & self-efficacy 0.196 0.155 0.154 0.393 0.618 0 Some concerns
Rusch et al. 2019 20 13 Hope, empowerment & self-efficacy -0.258 0.155 0.154 0.393 0.512 0 Some concerns
Rusch et al. 2019 20 13 Hope, empowerment & self-efficacy 0.772 0.391 0.381 0.617 0.217 0 Some concerns
Rusch et al. 2019 20 13 Self-esteem 0.338 0.094 0.092 0.304 0.271 0 Some concerns
Rusch et al. 2019 20 13 Hope, empowerment & self-efficacy 0.724 0.274 0.266 0.515 0.167 0 Some concerns
Sacks et al. 2011 38 38 Wellbeing and quality of life 0.074 0.068 0.068 0.262 0.779 1 Some concerns
Sacks et al. 2011 38 38 Wellbeing and quality of life -0.269 0.069 0.068 0.262 0.305 1 Some concerns
Sacks et al. 2011 38 38 Wellbeing and quality of life 0.953 0.075 0.068 0.262 0.000 1 Some concerns
Sajatovic et al. 2009 61 61 Social functioning (degree of impairment) 0.220 0.041 0.041 0.202 0.279 1 Some concerns
Sajatovic et al. 2009 46 53 Social functioning (degree of impairment) 0.086 0.052 0.052 0.228 0.706 1 Some concerns
Sajatovic et al. 2009 40 39 Social functioning (degree of impairment) 0.059 0.063 0.063 0.251 0.815 1 Some concerns
Schrank et al. 2016 43 41 Wellbeing and quality of life -0.104 0.062 0.061 0.248 0.675 0 Low
Schrank et al. 2016 43 41 Wellbeing and quality of life 0.445 0.063 0.061 0.248 0.076 0 Low
Schrank et al. 2016 43 41 Hope, empowerment & self-efficacy -0.341 0.062 0.061 0.248 0.171 0 Low
Schrank et al. 2016 43 41 Hope, empowerment & self-efficacy 0.021 0.061 0.061 0.248 0.932 0 Low
Schrank et al. 2016 43 41 Hope, empowerment & self-efficacy 0.148 0.062 0.061 0.248 0.550 0 Low
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse 0.144 0.023 0.022 0.150 0.339 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse 0.151 0.023 0.023 0.152 0.321 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse 0.346 0.023 0.022 0.150 0.022 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse -0.036 0.023 0.023 0.152 0.813 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse 0.223 0.023 0.022 0.150 0.138 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse 0.148 0.023 0.023 0.152 0.329 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse 0.088 0.022 0.022 0.150 0.558 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse 0.000 0.023 0.023 0.152 1.000 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse 0.369 0.023 0.022 0.150 0.015 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse 0.184 0.023 0.023 0.152 0.226 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse 0.264 0.023 0.022 0.150 0.079 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse 0.084 0.023 0.023 0.152 0.579 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse -0.306 0.023 0.022 0.150 0.042 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse -0.074 0.023 0.023 0.152 0.625 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse -0.495 0.023 0.022 0.150 0.001 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse -0.249 0.023 0.023 0.152 0.101 0 Some concerns
Schafer et al. 2019 115 117 Alcohol and drug abuse/misuse -0.249 0.023 0.022 0.150 0.097 0 Some concerns
Schafer et al. 2019 111 117 Alcohol and drug abuse/misuse -0.080 0.023 0.023 0.152 0.600 0 Some concerns
Somers et al. 2017 90 100 Social functioning (degree of impairment) 0.252 0.034 0.034 0.184 0.172 0 Low
Somers et al. 2017 90 100 Social functioning (degree of impairment) 0.661 0.044 0.043 0.208 0.002 0 Low
Somers et al. 2017 90 100 Alcohol and drug abuse/misuse -0.143 0.041 0.041 0.203 0.480 0 Low
Somers et al. 2017 90 100 Wellbeing and quality of life 0.250 0.034 0.033 0.183 0.172 0 Low
Tjaden et al. 2021 70 67 Hope, empowerment & self-efficacy 0.353 0.038 0.038 0.194 0.071 0 Low
Tjaden et al. 2021 70 67 Wellbeing and quality of life 0.082 0.038 0.038 0.194 0.672 0 Low
Tjaden et al. 2021 70 67 Social functioning (degree of impairment) -0.213 0.036 0.038 0.194 0.262 0 Low
Tjaden et al. 2021 63 58 Hope, empowerment & self-efficacy 0.532 0.044 0.042 0.206 0.011 0 Low
Tjaden et al. 2021 63 58 Wellbeing and quality of life -0.032 0.042 0.042 0.206 0.875 0 Low
Tjaden et al. 2021 63 58 Social functioning (degree of impairment) 0.008 0.041 0.042 0.206 0.970 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life 0.150 0.048 0.047 0.218 0.492 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life 0.104 0.048 0.047 0.218 0.632 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life 0.138 0.048 0.047 0.218 0.526 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life 0.325 0.048 0.047 0.218 0.137 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life 0.136 0.048 0.047 0.218 0.534 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life 0.028 0.047 0.047 0.218 0.897 0 Low
Valiente et al. 2022 52 61 Wellbeing and quality of life -0.172 0.048 0.047 0.218 0.430 0 Low
Volpe et al. 2015 21 20 Social functioning (degree of impairment) 0.092 0.126 0.126 0.355 0.795 1 Some concerns
Volpe et al. 2015 21 20 Social functioning (degree of impairment) 1.355 0.150 0.126 0.355 0.000 1 Some concerns
Wojtalik et al. 2022 26 23 Social functioning (degree of impairment) 0.105 0.089 0.089 0.299 0.725 0 Low
Smith et al. 2021 27 35 Loneliness 0.679 0.093 0.089 0.298 0.026 1 High
Wuthrich & Rapee 2013 27 35 Wellbeing and quality of life 0.511 0.091 0.089 0.298 0.090 0 Some concerns

A general overview of the main data, we use for analyses of mental health outcomes can be found the scroll box below.

Show the code
mental_health_dat <- 
  gb_dat |> 
  filter(outcome_construct == "Mental health outcome") 

saveRDS(mental_health_dat, file = "mental_health_dat.rds")

mental_overview_dat <- 
  mental_health_dat |> 
  select(
    study, eppi_id, esid, N_t, N_c, N_total, inv_sample_size, gt_pop, vgt_pop, Wgt_pop, gt, vgt, Wgt, Wse, 
    prereg_chr, conventional, analysis_plan, Overall, D5, D7, timing
  )

mental_overview_dat |> 
  mutate(
    p_val = 2 * ( 1 - pnorm( abs(gt_pop) / sqrt(vgt_pop) ) )
  ) |> 
  select(
    `Authors (year)` = study, N_t, N_c,
    `Outcome construct` = analysis_plan, gt_pop, vgt_pop, Wgt, Wse, p_val, 
    `No protocol` = conventional, `Overall RoB` = Overall
  ) |> 
  kable(digits=3)  |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "300px", fixed_thead = TRUE)
Table 2: Data with mental health outcomes.
Authors (year) N_t N_c Outcome construct gt_pop vgt_pop Wgt Wse p_val No protocol Overall RoB
Acarturk et al. 2022 24 22 General mental health 0.534 0.087 0.084 0.289 0.070 0 Some concerns
Acarturk et al. 2022 24 22 General mental health 0.257 0.093 0.092 0.303 0.398 0 High
Acarturk et al. 2022 24 22 General mental health 0.559 0.135 0.131 0.362 0.128 0 Some concerns
Acarturk et al. 2022 24 22 General mental health 0.339 0.134 0.133 0.364 0.354 0 High
Baekkelund et al. 2022 29 30 General mental health 0.112 0.163 0.163 0.403 0.782 0 Low
Baekkelund et al. 2022 29 30 General mental health 0.100 0.140 0.140 0.375 0.789 0 Low
Cano-Vindel et al. 2021 315 316 Anxiety 0.906 0.004 0.003 0.054 0.000 0 Low
Cano-Vindel et al. 2021 315 316 Depression 0.755 0.005 0.001 0.032 0.000 0 Low
Cano-Vindel et al. 2021 315 316 General mental health 0.611 0.007 0.007 0.083 0.000 0 Low
Cano-Vindel et al. 2021 273 238 Anxiety 0.493 0.004 0.004 0.059 0.000 0 Low
Cano-Vindel et al. 2021 273 238 Depression 0.434 0.002 0.001 0.035 0.000 0 Low
Cano-Vindel et al. 2021 273 238 General mental health 0.467 0.009 0.008 0.091 0.000 0 Low
Cano-Vindel et al. 2021 229 204 Anxiety 0.552 0.005 0.004 0.065 0.000 0 Low
Cano-Vindel et al. 2021 229 204 Depression 0.466 0.003 0.001 0.038 0.000 0 Low
Cano-Vindel et al. 2021 229 204 General mental health 0.459 0.010 0.010 0.099 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Anxiety 0.580 0.005 0.005 0.068 0.000 0 Low
Cano-Vindel et al. 2021 208 180 Depression 0.450 0.003 0.002 0.040 0.000 0 Low
Cano-Vindel et al. 2021 208 180 General mental health 0.551 0.011 0.011 0.105 0.000 0 Low
Craigie & Nathan 2009 157 77 Depression -0.498 0.025 0.022 0.150 0.002 1 Serious
Craigie & Nathan 2009 157 77 Anxiety -0.549 0.022 0.021 0.145 0.000 1 Serious
Crawford et al. 2012 121 121 Symptoms of psychosis 0.155 0.040 0.040 0.200 0.439 0 Low
Crawford et al. 2012 119 121 Symptoms of psychosis 0.007 0.040 0.040 0.201 0.974 0 Low
Crawford et al. 2012 121 117 Symptoms of psychosis 0.152 0.040 0.040 0.200 0.446 0 Low
Crawford et al. 2012 117 117 Symptoms of psychosis 0.024 0.041 0.041 0.203 0.905 0 Low
Dyck et al. 2000 21 21 Symptoms of psychosis 0.145 0.005 0.004 0.066 0.032 1 Some concerns
Gestel-Timmermans et al. 2012 134 116 General mental health 0.184 0.014 0.014 0.120 0.127 0 High
Gestel-Timmermans et al. 2012 121 100 General mental health 0.076 0.016 0.016 0.125 0.545 0 High
Gatz et al. 2007 136 177 General mental health -0.052 0.011 0.011 0.103 0.616 1 Serious
Gatz et al. 2007 136 177 General mental health -0.216 0.016 0.016 0.126 0.087 1 Serious
Gonzalez & Prihoda 2007 8 9 General mental health 0.596 0.205 0.193 0.439 0.188 1 Serious
Gordon et al. 2018 21 15 General mental health 0.066 0.141 0.141 0.375 0.861 1 Some concerns
Gutman et al. 2019 10 10 General mental health 1.140 0.070 0.034 0.184 0.000 1 Serious
Hagen et al. 2005 15 17 General mental health 0.407 0.169 0.166 0.408 0.323 1 High
Hagen et al. 2005 15 17 Anxiety 0.521 0.171 0.166 0.408 0.208 1 High
Hagen et al. 2005 15 15 Depression 0.355 0.169 0.173 0.416 0.387 1 High
Haslam et al. 2019 66 54 Depression -0.033 0.000 0.000 0.021 0.109 0 High
Haslam et al. 2019 66 54 General mental health -0.478 0.025 0.024 0.155 0.002 0 High
Hilden et al. 2021 23 12 General mental health -0.337 0.142 0.140 0.375 0.371 0 High
Hilden et al. 2021 23 12 Anxiety -0.202 0.141 0.140 0.375 0.591 0 High
Himle et al. 2014 29 29 General mental health 0.597 0.086 0.083 0.288 0.042 0 Some concerns
Himle et al. 2014 29 29 General mental health 0.385 0.084 0.083 0.288 0.184 0 Some concerns
Himle et al. 2014 29 29 General mental health 0.379 0.084 0.083 0.288 0.191 0 Some concerns
Himle et al. 2014 29 29 Anxiety 0.564 0.086 0.083 0.288 0.054 0 Some concerns
Himle et al. 2014 29 29 General mental health 0.628 0.086 0.083 0.288 0.033 0 Some concerns
Himle et al. 2014 29 29 General mental health 0.729 0.088 0.083 0.288 0.014 0 Some concerns
Himle et al. 2014 29 29 General mental health 0.827 0.089 0.083 0.288 0.006 0 Some concerns
Himle et al. 2014 29 29 Anxiety 0.297 0.084 0.083 0.288 0.304 0 Some concerns
Jacob et al. 2010 19 24 Depression 0.482 0.114 0.116 0.341 0.152 1 Serious
Jacob et al. 2010 19 24 Depression 0.379 0.113 0.116 0.341 0.260 1 Serious
James et al. 2004 29 29 General mental health 0.783 0.088 0.083 0.288 0.008 1 Some concerns
James et al. 2004 31 29 General mental health 0.465 0.081 0.079 0.282 0.103 1 Some concerns
Kanie et al. 2019 32 29 General mental health 0.037 0.078 0.078 0.279 0.893 0 Low
Kanie et al. 2019 32 29 Symptoms of psychosis -0.041 0.078 0.078 0.279 0.882 0 Low
Lim et al. 2020 18 21 Symptoms of psychosis 0.667 0.143 0.137 0.371 0.078 1 Serious
Lim et al. 2020 18 21 Symptoms of psychosis -0.084 0.137 0.137 0.371 0.821 1 Serious
Lim et al. 2020 18 21 Symptoms of psychosis 0.695 0.144 0.137 0.371 0.067 1 Serious
Lim et al. 2020 18 21 Symptoms of psychosis -0.644 0.143 0.137 0.371 0.089 1 Serious
Lim et al. 2020 18 21 Symptoms of psychosis 0.574 0.142 0.137 0.371 0.128 1 Serious
Lloyd-Evans et al. 2020 25 10 Anxiety 0.501 0.162 0.158 0.398 0.213 0 Low
Lloyd-Evans et al. 2020 25 10 Depression 0.456 0.157 0.158 0.398 0.250 0 Low
Madigan et al. 2013 42 22 General mental health 0.000 0.081 0.081 0.285 1.000 1 Some concerns
Madigan et al. 2013 40 20 Symptoms of psychosis -0.122 0.088 0.088 0.296 0.680 1 Some concerns
Madigan et al. 2013 40 20 Depression 0.065 0.088 0.088 0.296 0.827 1 Some concerns
Madigan et al. 2013 32 17 General mental health -0.024 0.106 0.106 0.326 0.942 1 Some concerns
Madigan et al. 2013 32 19 Symptoms of psychosis 0.156 0.101 0.100 0.317 0.623 1 Some concerns
Madigan et al. 2013 33 11 Depression 0.022 0.133 0.133 0.365 0.952 1 Some concerns
McCay et al. 2006 26 14 Symptoms of psychosis 0.171 0.115 0.114 0.338 0.613 1 Serious
McCay et al. 2006 26 14 Symptoms of psychosis 0.633 0.169 0.164 0.405 0.124 1 Serious
Michalak et al. 2015 36 35 Depression 0.253 0.068 0.067 0.260 0.332 0 Some concerns
Michalak et al. 2015 36 35 Depression 0.577 0.066 0.067 0.260 0.025 0 Some concerns
Michalak et al. 2015 35 35 Depression 0.830 0.074 0.069 0.262 0.002 0 Some concerns
Michalak et al. 2015 35 35 Depression 0.526 0.067 0.069 0.262 0.042 0 Some concerns
Morley et al. 2014 122 63 General mental health -0.475 0.028 0.027 0.166 0.005 1 Some concerns
Morley et al. 2014 122 63 Depression 0.021 0.027 0.027 0.166 0.898 1 Some concerns
Morley et al. 2014 122 63 Anxiety -0.205 0.028 0.027 0.166 0.216 1 Some concerns
Morton et al. 2012 21 20 General mental health 0.758 0.103 0.096 0.309 0.018 1 Some concerns
Morton et al. 2012 21 20 General mental health 0.554 0.052 0.048 0.219 0.015 1 Some concerns
Morton et al. 2012 21 20 General mental health 0.280 0.049 0.048 0.219 0.205 1 Some concerns
Morton et al. 2012 21 20 General mental health 0.481 0.051 0.048 0.219 0.033 1 Some concerns
Patterson et al. 2003 16 16 Symptoms of psychosis 0.451 0.166 0.162 0.403 0.269 1 Some concerns
Patterson et al. 2003 16 16 Symptoms of psychosis 0.962 0.178 0.162 0.403 0.023 1 Some concerns
Patterson et al. 2003 16 16 Symptoms of psychosis 0.449 0.166 0.162 0.403 0.270 1 Some concerns
Patterson et al. 2003 16 16 Depression 0.625 0.169 0.162 0.403 0.128 1 Some concerns
Patterson et al. 2003 16 16 Symptoms of psychosis 0.558 0.168 0.162 0.403 0.173 1 Some concerns
Patterson et al. 2003 16 16 Symptoms of psychosis 0.874 0.176 0.162 0.403 0.037 1 Some concerns
Patterson et al. 2003 16 16 Symptoms of psychosis 0.563 0.168 0.162 0.403 0.170 1 Some concerns
Patterson et al. 2003 16 16 Depression 0.739 0.172 0.162 0.403 0.075 1 Some concerns
Popolo et al. 2019 8 10 General mental health 0.421 0.329 0.324 0.569 0.464 1 Some concerns
Popolo et al. 2019 8 10 General mental health 0.876 0.269 0.245 0.495 0.091 1 Some concerns
Rabenstein et al. 2016 153 148 General mental health -0.367 0.018 0.018 0.135 0.007 1 Moderate
Rabenstein et al. 2016 153 148 Depression -0.421 0.017 0.017 0.132 0.001 1 Moderate
Rusch et al. 2019 18 17 Depression 0.648 0.092 0.086 0.293 0.033 0 Some concerns
Rusch et al. 2019 20 13 Depression 0.366 0.183 0.181 0.425 0.392 0 Some concerns
Sacks et al. 2011 38 38 Depression -0.048 0.066 0.068 0.262 0.852 1 Some concerns
Sacks et al. 2011 38 38 General mental health -0.064 0.068 0.068 0.262 0.806 1 Some concerns
Sajatovic et al. 2009 63 65 Depression 0.234 0.039 0.039 0.198 0.239 1 Some concerns
Sajatovic et al. 2009 63 65 General mental health 0.302 0.040 0.039 0.198 0.130 1 Some concerns
Sajatovic et al. 2009 51 55 Depression 0.212 0.048 0.048 0.218 0.334 1 Some concerns
Sajatovic et al. 2009 51 55 General mental health 0.104 0.048 0.048 0.218 0.635 1 Some concerns
Sajatovic et al. 2009 41 39 Depression 0.108 0.062 0.062 0.249 0.665 1 Some concerns
Sajatovic et al. 2009 41 39 General mental health 0.189 0.062 0.062 0.249 0.448 1 Some concerns
Saloheimo et al. 2016 27 34 Depression 0.482 0.075 0.073 0.269 0.078 0 Some concerns
Schrank et al. 2016 43 41 General mental health 0.151 0.062 0.061 0.248 0.542 0 Low
Schafer et al. 2019 115 117 Depression 0.081 0.022 0.022 0.150 0.584 0 Some concerns
Schafer et al. 2019 111 117 Depression 0.162 0.022 0.023 0.152 0.280 0 Some concerns
Schafer et al. 2019 115 117 Depression 0.210 0.022 0.022 0.150 0.155 0 Some concerns
Schafer et al. 2019 111 117 Depression 0.186 0.022 0.023 0.152 0.214 0 Some concerns
Schafer et al. 2019 115 117 Depression 0.032 0.022 0.022 0.150 0.827 0 Some concerns
Schafer et al. 2019 111 117 Depression 0.283 0.022 0.023 0.152 0.059 0 Some concerns
Schafer et al. 2019 115 117 General mental health 0.137 0.023 0.022 0.150 0.360 0 Some concerns
Schafer et al. 2019 111 117 General mental health 0.103 0.023 0.023 0.152 0.497 0 Some concerns
Schafer et al. 2019 115 117 General mental health 0.296 0.023 0.022 0.150 0.049 0 Some concerns
Schafer et al. 2019 111 117 General mental health 0.182 0.023 0.023 0.152 0.230 0 Some concerns
Schafer et al. 2019 115 117 General mental health 0.080 0.022 0.022 0.150 0.595 0 Some concerns
Schafer et al. 2019 111 117 General mental health 0.102 0.023 0.023 0.152 0.500 0 Some concerns
Schafer et al. 2019 115 117 General mental health -0.050 0.022 0.022 0.150 0.739 0 Some concerns
Schafer et al. 2019 111 117 General mental health -0.089 0.023 0.023 0.152 0.558 0 Some concerns
Schafer et al. 2019 115 117 General mental health 0.190 0.023 0.022 0.150 0.205 0 Some concerns
Schafer et al. 2019 111 117 General mental health -0.110 0.023 0.023 0.152 0.469 0 Some concerns
Schafer et al. 2019 115 117 General mental health 0.035 0.022 0.022 0.150 0.816 0 Some concerns
Schafer et al. 2019 111 117 General mental health -0.026 0.023 0.023 0.152 0.866 0 Some concerns
Somers et al. 2017 90 100 General mental health -0.142 0.034 0.033 0.183 0.437 0 Low
Tjaden et al. 2021 70 67 General mental health -0.046 0.038 0.038 0.194 0.812 0 Low
Tjaden et al. 2021 63 58 General mental health -0.061 0.043 0.042 0.206 0.767 0 Low
Valiente et al. 2022 52 61 General mental health 0.046 0.047 0.047 0.218 0.832 0 Low
Valiente et al. 2022 52 61 General mental health 0.021 0.047 0.047 0.218 0.923 0 Low
Valiente et al. 2022 52 61 General mental health 0.000 0.047 0.047 0.218 1.000 0 Low
Valiente et al. 2022 52 61 General mental health 0.153 0.048 0.047 0.218 0.482 0 Low
Valiente et al. 2022 52 61 General mental health -0.131 0.048 0.047 0.218 0.547 0 Low
Valiente et al. 2022 52 61 General mental health 0.025 0.047 0.047 0.218 0.909 0 Low
Valiente et al. 2022 52 61 General mental health -0.043 0.047 0.047 0.218 0.844 0 Low
Valiente et al. 2022 52 61 General mental health 0.033 0.047 0.047 0.218 0.881 0 Low
Valiente et al. 2022 52 61 General mental health 0.157 0.048 0.047 0.218 0.470 0 Low
Volpe et al. 2015 21 20 General mental health 0.213 0.127 0.126 0.355 0.549 1 Some concerns
Volpe et al. 2015 21 20 Depression 0.125 0.124 0.126 0.355 0.723 1 Some concerns
Wojtalik et al. 2022 26 23 General mental health 0.084 0.022 0.021 0.147 0.566 0 Low
Wuthrich & Rapee 2013 27 35 Anxiety 1.654 0.113 0.089 0.298 0.000 0 Some concerns
Smith et al. 2021 27 35 Anxiety 1.346 0.105 0.089 0.298 0.000 1 Some concerns
Smith et al. 2021 27 35 Depression 1.801 0.119 0.089 0.298 0.000 1 Some concerns
Wuthrich & Rapee 2013 27 35 Depression 0.811 0.095 0.089 0.298 0.008 0 Some concerns
Wuthrich & Rapee 2013 27 35 Anxiety 0.462 0.091 0.089 0.298 0.125 0 Some concerns

Risk of bias

In this section, we present the main risk og bias (RoB) visualizations.

Note

Note that in plots where the number of studies appears on the x-axis, some bars differ in length. This occurs because a single study contribute multiple effect size estimates that received different RoB assessments.

RoB2

Show the code
rho <- 0.8

V_mat <- metafor::vcalc(vi = vgt_pop, cluster = study, obs = esid, data = reintegration_dat, rho = rho) 

rma_res <- 
  metafor::rma.mv(
    gt_pop, 
    V = V_mat,
    random = ~ 1 | study / esid,
    data = reintegration_dat
  )

tau2 <- rma_res$sigma2[1]
omega2<- rma_res$sigma2[2]

reint_rob2_dat <- 
  reintegration_dat |> 
  mutate(
    kj = n(),
    sigma2j = mean(vgt_pop),
    weight = 1 / (kj*tau2 + omega2 + (kj-1)*rho*sigma2j + sigma2j),
    .by = study
  ) |> 
  filter(rob_tool == "RoB2") |> 
  select(
    prereg = prereg_chr, study, D1:D5, Overall, weight
  ) 


rob_sum <-  
  reint_rob2_dat |> 
  pivot_longer(D1:Overall, names_to = "Category", values_to = "Rating") |> 
  mutate(
    Category = factor(
      Category, levels = c(paste0("D", 1:5), "Overall"), 
      labels = c(
        "Bias arising from the randomization process",
        "Bias due to deviations from intended interventions",
        "Bias due to missing outcome data",
        "Bias in measurement of the outcome",
        "Bias in selection of the reported result",
        "Overall risk of bias"
        )
      ),
    
    Rating = case_when(str_detect(Rating, "Some") ~ "Some concerns", .default = Rating),
    
    Rating = factor(Rating, levels = c("Low", "Some concerns", "High"))
    
  ) |> 
  group_by(prereg, Category, Rating, study) |> 
  summarize(
    effects = n(),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  summarise(
    studies = length(unique(study)),
    effects = sum(effects),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  mutate(
    effects_pct = 100 * effects / sum(effects),
    studies_pct = 100 * studies / sum(studies),
    effects_pct_w = weight/sum(weight) * 100,
    studies_w = studies * weight,
    studies_pct_w = studies_w / sum(studies_w) * 100
  ) |> 
  ungroup() 

# Mental health
V_mat_mental <- metafor::vcalc(vi = vgt_pop, cluster = study, obs = esid, data = mental_health_dat, rho = rho) 

rma_res_mental <- 
  metafor::rma.mv(
    gt_pop, 
    V = V_mat_mental,
    random = ~ 1 | study / esid,
    data = mental_health_dat
  )

tau2_mental <- rma_res_mental$sigma2[1]
omega2_mental <- rma_res_mental$sigma2[2]

mental_rob2_dat <- 
  mental_health_dat |> 
  mutate(
    kj = n(),
    sigma2j = mean(vgt_pop),
    weight = 1 / (kj*tau2_mental + omega2_mental + (kj-1)*rho*sigma2j + sigma2j),
    .by = study
  ) |> 
  filter(rob_tool == "RoB2") |> 
  select(
    prereg = prereg_chr, study, D1:D5, Overall, weight
  ) 


rob_sum_mental <-  
  mental_rob2_dat |> 
  pivot_longer(D1:Overall, names_to = "Category", values_to = "Rating") |> 
  mutate(
    Category = factor(
      Category, levels = c(paste0("D", 1:5), "Overall"), 
      labels = c(
        "Bias arising from the randomization process",
        "Bias due to deviations from intended interventions",
        "Bias due to missing outcome data",
        "Bias in measurement of the outcome",
        "Bias in selection of the reported result",
        "Overall risk of bias"
        )
      ),
    
    Rating = case_when(str_detect(Rating, "Some") ~ "Some concerns", .default = Rating),
    
    Rating = factor(Rating, levels = c("Low", "Some concerns", "High"))
    
  ) |> 
  group_by(prereg, Category, Rating, study) |> 
  summarize(
    effects = n(),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  summarise(
    studies = length(unique(study)),
    effects = sum(effects),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  mutate(
    effects_pct = 100 * effects / sum(effects),
    studies_pct = 100 * studies / sum(studies),
    effects_pct_w = weight/sum(weight) * 100,
    studies_w = studies * weight,
    studies_pct_w = studies_w / sum(studies_w) * 100
  ) |> 
  ungroup() 

Overall (Not preregistered vs. preregistered)

Show the code
rob_pct_studies <- 
  rob_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Study-level"
    ) |> 
  ggplot(aes(x = studies, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Number of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "none",
    strip.text.x = element_text(size = 14),
    strip.text.y = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  )  + 
  facetted_pos_scales(
    x = list(
      prereg == "Not preregistered" ~ scale_x_continuous(breaks = seq(0, 16, 2)
      )
    )
  )

rob_pct_effects <- 
  rob_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Outcome-level"
    ) |> 
  ggplot(aes(x = effects, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    x = "Number of effects",
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_blank(),
    strip.text.y = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  ) + 
  facetted_pos_scales(
    x = list(
      prereg == "Preregistered" ~ scale_x_continuous(breaks = seq(0, 150, 25)
      )
    )
  )

#png(filename = "Figures/rob2_reint.png", width = 12, height = 7, units = "in", res = 600)
rob_pct_studies / rob_pct_effects
#dev.off()
Figure 1: RoB2 plot for reintegration studies and outcomes across type of registration (raw numbers)
Show the code
rob_pct_studies_weight <- 
  rob_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "none",
    axis.title.x=element_blank()
  ) 

rob_pct_effects_weight <- 
  rob_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    x = "Weighted percentage",
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_blank()
  ) 


rob_pct_studies_weight / rob_pct_effects_weight
Figure 2: RoB2 plot for reintegration studies and outcomes across type of registration (weighted percentage)
Show the code
rob_pct_studies_unweight <- 
  rob_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "none",
    axis.title.x=element_blank()
  ) 

rob_pct_effects_unweight <- 
  rob_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    x = "Percentage",
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_blank()
  ) 


rob_pct_studies_unweight / rob_pct_effects_unweight
Figure 3: RoB2 plot for reintegration studies and outcomes across type of registration (unweighted percentage)
Show the code
rob_pct_studies_mental <- 
  rob_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Study-level"
    ) |> 
  ggplot(aes(x = studies, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Number of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "none",
    strip.text.x = element_text(size = 14),
    strip.text.y = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  )  + 
  facetted_pos_scales(
    x = list(
      prereg == "Not preregistered" ~ scale_x_continuous(breaks = seq(0, 16, 2)
      )
    )
  )

rob_pct_effects_mental <- 
  rob_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Outcome-level"
    ) |> 
  ggplot(aes(x = effects, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    x = "Number of effects",
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_blank(),
    strip.text.y = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  ) 

#png(filename = "Figures/rob2_mental.png", width = 12, height = 7, units = "in", res = 600)
rob_pct_studies_mental / rob_pct_effects_mental
#dev.off()
Figure 4: RoB2 plot for mental health studies and outcomes across type of registration (raw numbers)
Show the code
rob_pct_studies_weight_mental <- 
  rob_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "none",
    axis.title.x=element_blank()
  ) 

rob_pct_effects_weight_mental <- 
  rob_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    x = "Weighted percentage",
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_blank()
  ) 


rob_pct_studies_weight_mental / rob_pct_effects_weight_mental
Figure 5: RoB2 plot for mental health studies and outcomes across type of registration (weighted percentage)
Show the code
rob_pct_studies_unweight_mental <- 
  rob_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "none",
    axis.title.x=element_blank()
  ) 

rob_pct_effects_unweight <- 
  rob_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(level ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    x = "Percentage",
    y = "",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_blank()
  ) 


rob_pct_studies_unweight / rob_pct_effects_unweight
Figure 6: RoB2 plot for mental health studies and outcomes across type of registration (unweighted percentage)

Subgrouped risk of bias plots

Show the code
reint_rob2_subgrp_dat <- 
  reintegration_dat |> 
  mutate(
    kj = n(),
    sigma2j = mean(vgt_pop),
    weight = 1 / (kj*tau2 + omega2 + (kj-1)*rho*sigma2j + sigma2j),
    .by = study
  ) |> 
  filter(rob_tool == "RoB2" & str_detect(analysis_plan, "Alco|Well|Hope|Social")) |> 
  select(
    outcome = analysis_plan, prereg = prereg_chr, study, D1:D5, Overall, weight
  ) |> 
  mutate(
    outcome = case_match(
      outcome,
      "Alcohol and drug abuse/misuse" ~ "Alcohol/drugs",
      "Hope, empowerment & self-efficacy" ~ "Hope/empower",
      "Social functioning (degree of impairment)" ~ "Social function",
      "Wellbeing and quality of life" ~ "Wellbeing/QoL"
    )
  )


rob_sum_subgrp <-  
  reint_rob2_subgrp_dat |> 
  pivot_longer(D1:Overall, names_to = "Category", values_to = "Rating") |> 
  mutate(
    Category = factor(
      Category, levels = c(paste0("D", 1:5), "Overall"), 
      labels = c(
        "Bias arising from the randomization process",
        "Bias due to deviations from intended interventions",
        "Bias due to missing outcome data",
        "Bias in measurement of the outcome",
        "Bias in selection of the reported result",
        "Overall risk of bias"
        )
      ),
    
    Rating = case_when(str_detect(Rating, "Some") ~ "Some concerns", .default = Rating),
    
    Rating = factor(Rating, levels = c("Low", "Some concerns", "High"))
    
  ) |> 
  group_by(prereg, outcome, Category, Rating, study) |> 
  summarize(
    effects = n(),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  summarise(
    studies = length(unique(study)),
    effects = sum(effects),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  mutate(
    effects_pct = 100 * effects / sum(effects),
    studies_pct = 100 * studies / sum(studies),
    effects_pct_w = weight/sum(weight) * 100,
    studies_w = studies * weight,
    studies_pct_w = studies_w / sum(studies_w) * 100
  ) |> 
  ungroup() 

# Mental health
mental_rob2_subgrp_dat <- 
  mental_health_dat |> 
  mutate(
    kj = n(),
    sigma2j = mean(vgt_pop),
    weight = 1 / (kj*tau2 + omega2 + (kj-1)*rho*sigma2j + sigma2j),
    .by = study
  ) |> 
  filter(rob_tool == "RoB2") |> 
  select(
    outcome = analysis_plan, prereg = prereg_chr, study, D1:D5, Overall, weight
  ) |> 
  mutate(
    outcome = factor(
      outcome, 
      levels = c("Anxiety", "Depression", "General mental health", "Symptoms of psychosis")
    )
  )


rob_sum_subgrp_mental <-  
  mental_rob2_subgrp_dat |> 
  pivot_longer(D1:Overall, names_to = "Category", values_to = "Rating") |> 
  mutate(
    Category = factor(
      Category, levels = c(paste0("D", 1:5), "Overall"), 
      labels = c(
        "Bias arising from the randomization process",
        "Bias due to deviations from intended interventions",
        "Bias due to missing outcome data",
        "Bias in measurement of the outcome",
        "Bias in selection of the reported result",
        "Overall risk of bias"
        )
      ),
    
    Rating = case_when(str_detect(Rating, "Some") ~ "Some concerns", .default = Rating),
    
    Rating = factor(Rating, levels = c("Low", "Some concerns", "High"))
    
  ) |> 
  group_by(prereg, outcome, Category, Rating, study) |> 
  summarize(
    effects = n(),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  summarise(
    studies = length(unique(study)),
    effects = sum(effects),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  mutate(
    effects_pct = 100 * effects / sum(effects),
    studies_pct = 100 * studies / sum(studies),
    effects_pct_w = weight/sum(weight) * 100,
    studies_w = studies * weight,
    studies_pct_w = studies_w / sum(studies_w) * 100
  ) |> 
  ungroup() 
Show the code
rob_studies_subgrp <- 
  rob_sum_subgrp |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_nested_wrap(outcome ~ prereg, scales = "free_x", ncol = 2) + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Number of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  )  + 
  facetted_pos_scales(
    x = list(
      prereg == "Not preregistered" & outcome == "Alcohol/drugs" ~ scale_x_continuous(breaks = seq(0, 2, 1)),
      prereg == "Preregistered" & outcome == "Wellbeing/QoL" ~ scale_x_continuous(breaks = seq(0, 14, 2)),
      prereg == "Preregistered" & outcome == "Social function" ~ scale_x_continuous(breaks = seq(0, 10, 2))
    )
  )

rob_studies_subgrp
Figure 7: RoB2 plot for reintegration studies and outcomes by type of registration and outcome (number of studies)
Show the code
# Weigthed percent
rob_weight_pct_studies_subgrp <- 
  rob_sum_subgrp |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_weight_pct_studies_subgrp
Figure 8: RoB2 plot for reintegration studies and outcomes by type of registration and outcome (weighted percentage of studies)
Show the code
# unweigthed percent
rob_unweight_pct_studies_subgrp <- 
  rob_sum_subgrp |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Percentage of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_unweight_pct_studies_subgrp
Figure 9: RoB2 plot for reintegration studies and outcomes by type of registration and outcome (unweighted percentage of studies)
Show the code
rob_effects_subgrp <- 
  rob_sum_subgrp |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_nested_wrap(outcome ~ prereg, scales = "free_x", ncol = 2) + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Number of effects",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  )  + 
  facetted_pos_scales(
    x = list(
      prereg == "Not preregistered" & outcome == "Hope/empower" ~ scale_x_continuous(breaks = seq(0, 12, 2)),
      prereg == "Preregistered" & outcome == "Hope/empower" ~ scale_x_continuous(breaks = seq(0, 20, 5)),
      prereg == "Not preregistered" & outcome == "Social function" ~ scale_x_continuous(breaks = seq(0, 10, 2)),
      prereg == "Preregistered" & outcome == "Social function" ~ scale_x_continuous(breaks = seq(0, 40, 10)),
      prereg == "Not preregistered" & outcome == "Wellbeing/QoL" ~ scale_x_continuous(breaks = seq(0, 10, 2))
    )
  )

rob_effects_subgrp
Figure 10: RoB2 plot for reintegration studies and outcomes by type of registration and outcome (number of effects)
Show the code
# Weigthed percent
rob_weight_pct_effects_subgrp <- 
  rob_sum_subgrp |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage of effects",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_weight_pct_effects_subgrp
Figure 11: RoB2 plot for reintegration studies and outcomes by type of registration and outcome (weighted percentage of effects)
Show the code
# unweigthed percent
rob_unweight_pct_effects_subgrp <- 
  rob_sum_subgrp |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = effects_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Percentage of effects",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_unweight_pct_effects_subgrp
Figure 12: RoB2 plot for reintegration studies and outcomes by type of registration and outcome (unweighted percentage of effects)
Show the code
rob_studies_subgrp_mental <- 
  rob_sum_subgrp_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_nested_wrap(outcome ~ prereg, scales = "free_x", ncol = 2) + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Number of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  )  + 
  facetted_pos_scales(
    x = list(
      prereg == "Not preregistered" & outcome == "Anxiety" ~ scale_x_continuous(breaks = seq(0, 2, 1)),
      prereg == "Preregistered" & outcome == "Depression" ~ scale_x_continuous(breaks = seq(0, 10, 2)),
      prereg == "Not preregistered" & outcome == "General mental health" ~ scale_x_continuous(breaks = seq(0, 10, 2)),
      prereg == "Preregistered" & outcome == "Symptoms of psychosis" ~ scale_x_continuous(breaks = seq(0, 2, 1))
    )
  )

rob_studies_subgrp_mental
Figure 13: RoB2 plot for mental studies and outcomes by type of registration and outcome (number of studies)
Show the code
# Weigthed percent
rob_weight_pct_studies_subgrp_mental <- 
  rob_sum_subgrp_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_weight_pct_studies_subgrp_mental
Figure 14: RoB2 plot for mental health studies and outcomes by type of registration and outcome (weighted percentage of studies)
Show the code
# unweigthed percent
rob_unweight_pct_studies_subgrp_mental <- 
  rob_sum_subgrp_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Percentage of studies",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_unweight_pct_studies_subgrp_mental
Figure 15: RoB2 plot for mental health studies and outcomes by type of registration and outcome (unweighted percentage of studies)
Show the code
rob_effects_subgrp_mental <- 
  rob_sum_subgrp_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_nested_wrap(outcome ~ prereg, scales = "free_x", ncol = 2) + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Number of effects",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  )  + 
  facetted_pos_scales(
    x = list(
      prereg == "Not preregistered" & outcome == "Anxiety" ~ scale_x_continuous(breaks = seq(0, 2, 1)),
      prereg == "Preregistered" & outcome == "Anxiety" ~ scale_x_continuous(breaks = seq(0, 10, 2)),
      prereg == "Not preregistered" & outcome == "Depression" ~ scale_x_continuous(breaks = seq(0, 10, 2)),
      prereg == "Not preregistered" & outcome == "Symptoms of psychosis" ~ scale_x_continuous(breaks = seq(0, 10, 2))
    )
  )

rob_effects_subgrp_mental
Figure 16: RoB2 plot for mental studies and outcomes by type of registration and outcome (number of effects)
Show the code
# Weigthed percent
rob_weight_pct_effects_subgrp_mental <- 
  rob_sum_subgrp_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage of effects",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_weight_pct_effects_subgrp_mental
Figure 17: RoB2 plot for mental health studies and outcomes by type of registration and outcome (weighted percentage of effects)
Show the code
# unweigthed percent
rob_unweight_pct_effects_subgrp_mental <- 
  rob_sum_subgrp_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = effects_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid2(outcome ~ prereg, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Some concerns" = "lightgoldenrodyellow", "High" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of the outcome",
      "Bias due to missing outcome data",
      "Bias due to deviations from intended interventions",
      "Bias arising from the randomization process"
    )
  ) +
  labs(
    y = "",
    x = "Percentage of effects",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

rob_unweight_pct_effects_subgrp_mental
Figure 18: RoB2 plot for mental health studies and outcomes by type of registration and outcome (unweighted percentage of effects)

ROBINS-I

Show the code
reint_robinsi_dat <- 
  reintegration_dat |> 
  mutate(
    kj = n(),
    sigma2j = mean(vgt_pop),
    weight = 1 / (kj*tau2 + omega2 + (kj-1)*rho*sigma2j + sigma2j),
    .by = study
  ) |> 
  filter(rob_tool == "ROBINS-I") |> 
  select(
    prereg = prereg_chr, study, D1:Overall, weight
  ) 


robinsi_sum <-  
  reint_robinsi_dat |> 
  pivot_longer(D1:Overall, names_to = "Category", values_to = "Rating") |> 
  mutate(
    Category = factor(
      Category, levels = c(paste0("D", 1:7), "Overall"), 
      labels = c(
        "Bias due to confounding",
        "Bias due to selection of participants",
        "Bias in classification of interventions",
        "Bias due to deviations from intended interventions",
        "Bias due to missing data",
        "Bias in measurement of outcomes",
        "Bias in selection of the reported result",
        "Overall risk of bias"
        )
      ),
    
    Rating = factor(Rating, levels = c("Low", "Moderate", "Serious"))
    
  ) |> 
  group_by(Category, Rating, study) |> 
  summarize(
    effects = n(),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  summarise(
    studies = length(unique(study)),
    effects = sum(effects),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  mutate(
    effects_pct = 100 * effects / sum(effects),
    studies_pct = 100 * studies / sum(studies),
    effects_pct_w = weight/sum(weight) * 100,
    studies_w = studies * weight,
    studies_pct_w = studies_w / sum(studies_w) * 100
  ) |> 
  ungroup() 

# Mental health
mental_robinsi_dat <- 
  mental_health_dat |> 
  mutate(
    kj = n(),
    sigma2j = mean(vgt_pop),
    weight = 1 / (kj*tau2 + omega2 + (kj-1)*rho*sigma2j + sigma2j),
    .by = study
  ) |> 
  filter(rob_tool == "ROBINS-I") |> 
  select(
    prereg = prereg_chr, study, D1:Overall, weight
  ) 


robinsi_sum_mental <-  
  mental_robinsi_dat |> 
  pivot_longer(D1:Overall, names_to = "Category", values_to = "Rating") |> 
  mutate(
    Category = factor(
      Category, levels = c(paste0("D", 1:7), "Overall"), 
      labels = c(
        "Bias due to confounding",
        "Bias due to selection of participants",
        "Bias in classification of interventions",
        "Bias due to deviations from intended interventions",
        "Bias due to missing data",
        "Bias in measurement of outcomes",
        "Bias in selection of the reported result",
        "Overall risk of bias"
        )
      ),
    
    Rating = factor(Rating, levels = c("Low", "Moderate", "Serious"))
    
  ) |> 
  group_by(Category, Rating, study) |> 
  summarize(
    effects = n(),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  summarise(
    studies = length(unique(study)),
    effects = sum(effects),
    weight = sum(weight),
    .groups = "drop_last"
  ) |> 
  mutate(
    effects_pct = 100 * effects / sum(effects),
    studies_pct = 100 * studies / sum(studies),
    effects_pct_w = weight/sum(weight) * 100,
    studies_w = studies * weight,
    studies_pct_w = studies_w / sum(studies_w) * 100
  ) |> 
  ungroup() 
Show the code
robin_studies <- 
  robinsi_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Raw number",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.x = element_text(size = 14),
    strip.text.y = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  ) 

robin_effects <- 
  robinsi_sum  |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Raw number",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    strip.text.x = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  ) 


#png(filename = "Figures/ROBINSI_reint.png", width = 12, height = 5, units = "in", res = 600)
(robin_studies + robin_effects) +
  plot_layout(guides = "collect", axis_titles = "collect") & theme(legend.position = 'bottom') 
#dev.off()
Figure 19: ROBINS-I plot for reintegration QES studies and outcomes (raw number)
Show the code
robin_pct_studies_weight <- 
  robinsi_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

robin_pct_effects_weight <- 
  robinsi_sum  |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "% Effects"
    ) |> 
  ggplot(aes(x = effects_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()
  ) 


(robin_pct_studies_weight + robin_pct_effects_weight) +
  plot_layout(guides = "collect", axis_titles = "collect") & theme(legend.position = 'bottom') 
Figure 20: ROBINS-I plot for reintegration QES studies and outcomes (weighted percentage)
Show the code
robin_pct_studies_unweight <- 
  robinsi_sum |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

robin_pct_effects_unweight <- 
  robinsi_sum  |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()
  ) 




(robin_pct_studies_unweight + robin_pct_effects_unweight) +
  plot_layout(guides = "collect", axis_titles = "collect") & theme(legend.position = 'bottom') 
Figure 21: ROBINS-I plot for reintegration QES studies and outcomes (unweighted percentage)
Show the code
robin_studies_mental <- 
  robinsi_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Raw number",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    strip.text.y = element_blank(),
    strip.text.x = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  ) 

robin_effects_mental <- 
  robinsi_sum_mental  |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Raw number",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    strip.text.x = element_text(size = 14),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 14)
  ) 

#png(filename = "Figures/RONINSI_mental.png", width = 12, height = 5, units = "in", res = 600)
(robin_studies_mental + robin_effects_mental) +
  plot_layout(guides = "collect", axis_titles = "collect") & theme(legend.position = 'bottom') 
#dev.off()
Figure 22: ROBINS-I plot for mental health QES studies and outcomes (raw number)
Show the code
robin_pct_studies_weight_mental <- 
  robinsi_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

robin_pct_effects_weight_mental <- 
  robinsi_sum_mental  |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct_w, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Weighted percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()
  ) 


(robin_pct_studies_weight_mental + robin_pct_effects_weight_mental) +
  plot_layout(guides = "collect", axis_titles = "collect") & theme(legend.position = 'bottom') 
Figure 23: ROBINS-I plot for mental health QES studies and outcomes (weighted percentage)
Show the code
robin_pct_studies_unweight_mental <- 
  robinsi_sum_mental |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Studies"
    ) |> 
  ggplot(aes(x = studies_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom"
  ) 

robin_pct_effects_unweight_mental <- 
  robinsi_sum_mental  |> 
  mutate(
    Rating = fct_rev(Rating),
    level = "Effects"
    ) |> 
  ggplot(aes(x = effects_pct, y = Category, fill = Rating)) + 
  geom_col(alpha = 0.9) +
  facet_grid(~ level, scales = "free_x") + 
  scale_fill_manual(
    values = c("Low" = "mediumaquamarine", "Moderate" = "lightgoldenrodyellow", "Serious" = "lightcoral")
  ) +
  scale_y_discrete(
    limits = rev,
    labels = c( 
      expression(bold("Overall risk of bias")),
      "Bias in selection of the reported result",
      "Bias in measurement of outcomes",
      "Bias due to missing data",
      "Bias due to deviations from intended interventions",
      "Bias in classification of interventions",
      "Bias due to selection of participants",
      "Bias due to confounding"
    )
  ) +
  labs(
    y = "",
    x = "Percentage",
    fill = "Risk of Bias"
  ) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()
  ) 




(robin_pct_studies_unweight_mental + robin_pct_effects_unweight_mental) +
  plot_layout(guides = "collect", axis_titles = "collect") & theme(legend.position = 'bottom') 
Figure 24: ROBINS-I plot for mental health QES studies and outcomes (unweighted percentage)

Descriptives and Dependence Structures

Timeline

Show the code
# Figure 1: Number of included studies in the meta-analysis by year
G_timeplot <- 
  group_based_dat |> 
  mutate(
    prereg = if_else(
      str_detect(protocol, regex("yes", ignore_case = TRUE)), 
      "Preregistered", "Not preregistered"
    )
  ) |> 
  reframe(year = unique(year), prereg = unique(prereg), .by =  study)

# DONE
timeline_plot <-  ggplot(G_timeplot, aes(x = year, fill = prereg)) + 
  geom_bar(col = "black", alpha = 1, width = 1) +
  scale_x_continuous(breaks = seq(2000, 2022, 1)) + 
  scale_y_continuous(breaks = seq(0, 6.5, 1), limits = c(0, 7), expand = c(0,0)) + 
  theme_bw() + 
  scale_fill_brewer(palette="Paired")+
  theme(
    axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
    #panel.border = element_blank(),
    legend.position = "bottom",
    legend.title = element_blank(),
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_blank(),
    axis.line = element_line(colour = "black")
  ) +
  labs(
    x = "Year of publication",
    y = "Number of studies",
  )

timeline_plot
Figure 25: Number of studies included in meta-analysis by year.

Number effects across effect size metrics

Show the code
# Number of studies reporting OR
group_based_dat |> 
  summarise(
    n = n(), 
    .by = c(study, effect_size)
  ) |> 
  summarise(
    N_studies = length(effect_size), 
    N_es = sum(n),
    .by = effect_size
  )
# A tibble: 2 × 3
  effect_size N_studies  N_es
  <chr>           <int> <int>
1 SMD                48   388
2 OR                  1     2

Average pre-posttest correlation

Reintegrational outcome

Show the code
reintegration_dat |> 
  filter(
    str_detect(
      ppcor_method, regex("Cal", ignore_case = TRUE), 
    ) |
    str_detect(
      ppcor_method, regex("From study", ignore_case = TRUE), 
    ) 
  ) |> 
  select(contains("ppcor")) |> 
  pull(ppcor) |> 
  mean()
[1] 0.6229602

Mental health

Show the code
mental_health_dat|> 
  filter(
    str_detect(
      ppcor_method, regex("Cal", ignore_case = TRUE), 
    ) |
    str_detect(
      ppcor_method, regex("From study", ignore_case = TRUE), 
    ) 
  ) |> 
  select(contains("ppcor")) |> 
  pull(ppcor) |> 
  mean()
[1] 0.5071045

Number of effect size estimates per study

Overall per study

Show the code
es_plot_per_study <- 
  gb_dat |>
  arrange(desc(study)) |>
  mutate(study = factor(study, unique(study))) |> 
  ggplot(aes(x = study)) +
  geom_bar(aes(fill = outcome_construct)) +
  scale_y_continuous(breaks = seq(5, 40, by = 5)) + 
  theme_minimal() +
  theme(
    legend.position = "bottom"
  ) +
  coord_flip() +
  labs(
    x = paste0("Study (", n_distinct(gb_dat$study), " studies in total)"), 
    y = "Number of Effect Size Estimates",
    fill = "Outcome construct"
  ) +
  guides(fill = guide_legend(reverse=TRUE))

es_plot_per_study
Figure 26: Distribution of number of effect size estimates per study

Across outcome subgroups per study

Show the code
reintegration_dat |>
ggplot(aes(y = study, fill = gt_pop >= 0)) + 
geom_bar(data = subset(reintegration_dat, gt_pop >= 0), aes(x = after_stat(count)), stat = "count") + 
geom_bar(data = subset(reintegration_dat, gt_pop < 0), aes(x = -after_stat(count)), stat = "count") + 
theme_minimal() +
scale_x_continuous(labels = abs, breaks = scales::breaks_width(5), limits = c(-10, 30)) +
scale_y_discrete(limits=rev) +
scale_fill_manual(
  values = c(met.brewer("Navajo")[2], met.brewer("Navajo")[4]), 
  labels = c("Negative ES", "Non-negative ES"), 
  name = "Effect Size"
) +
labs(x = "Number of Effect Size Estimates", y = "", title = "Reintegration") +
theme(
    legend.position = "bottom",
    #legend.position.inside = c(0.95, 0.05),
    #legend.justification = c(1, 0),
    legend.background = element_blank(),
    plot.title = element_text(hjust = 0.5) 
  )
Figure 27: Distribution of number of effects per study, by direction of the effects for reintegrational outcomes.
Show the code
mental_health_dat |>
ggplot(aes(y = study, fill = gt_pop >= 0)) + 
geom_bar(data = subset(mental_health_dat, gt_pop >= 0), aes(x = after_stat(count)), stat = "count") + 
geom_bar(data = subset(mental_health_dat, gt_pop < 0), aes(x = -after_stat(count)), stat = "count") + 
theme_minimal() +
scale_x_continuous(labels = abs, breaks = scales::breaks_width(5), limits = c(-5, 15)) +
scale_y_discrete(limits=rev) +
scale_fill_manual(
  values = c(met.brewer("Navajo")[2], met.brewer("Navajo")[4]), 
  labels = c("Negative ES", "Non-negative ES"), 
  name = "Effect Size"
) +
labs(x = "Number of Effect Size Estimates", y = "", title = "Mental Health") +
theme(
    legend.position = "bottom",
    #legend.position.inside = c(0.95, 0.2),
    #legend.justification = c(1, 0),
    legend.background = element_blank(),
    plot.title = element_text(hjust = 0.5) 
  )
Figure 28: Distribution of number of effects per study, by direction of the effects for mental health outcomes.

Overall across all studies and outcomes

Show the code
# Multi-arms studies
multi_arm_studies <- 
  gb_dat |> 
  filter(trt_id > 1) |> 
  reframe(study = unique(study))
  

# Multi-time-points studies
follow_up_studies <- 
  gb_dat |>
  summarise(
    time_points = length(unique(time_after_end_intervention_weeks)),
    .by = c(study, trt_id, ctr_id)
  ) |>
  filter(time_points > 1)

# Preregistered studies
prereg_studies <- 
  gb_dat |> 
  summarise(
    prereg_chr = unique(prereg_chr),
    n_es = n(),
    .by = study
  ) |> 
  summarise(
    N_studies = n_distinct(study),
    N_es = sum(n_es),
    .by = prereg_chr
  )

study_sample_sizes <- 
  gb_dat |>
  group_by(study, trt_id, ctr_id) |>
  summarise(
    effects = n(),
    participants = max(N_total)
  ) |>
  summarise(
    effects = sum(effects),
    participants = mean(participants),
    ctl_comparisons = n(),
    ctl_arms = paste(ctr_id, collapse = "; ")
  ) |>
  group_by(study, ctl_arms) |>
  summarise(
    effects = sum(effects),
    participants = mean(participants * (1 + ctl_comparisons * (n() - 1) / 2)),
    trt_comparisons = n(),
    trt_arms = paste(trt_id, collapse = "; "),
    ctl_comparisons = mean(ctl_comparisons)
  ) |>
  summarise(
    effects = sum(effects),
    participants = sum(participants),
    trt_comparisons = mean(trt_comparisons),
    ctl_comparisons = sum(ctl_comparisons)
  )

sample_size_summary <-
  study_sample_sizes |>
  summarise(
    studies = n(),
    studies_multiple_tx = sum(trt_comparisons > 1),
    studies_multiple_ctl = sum(ctl_comparisons > 1),
    n_effects = sum(effects),
    mean_effects = mean(effects),
    min_effects = min(effects),
    median_effects = median(effects),
    max_effects = max(effects),
    participants = round(sum(participants))
  ) |> 
  mutate(prereg = prereg_studies$N_studies[1])

n_studies <- sample_size_summary$studies
Show the code
kable(
  sample_size_summary,
  col.names = c(
    studies = "Studies",
    studies_multiple_tx = "Multi-treatment studies",
    studies_multiple_ctl = "Multi-control studies",
    n_effects = "Effects",
    mean_effects = "Mean",
    min_effects = "Minimum",
    median_effects = "Median",
    max_effects = "Maximum",
    participants = "Participants",
    prereg = "Preregistered studies"
  ),
  digits = 1
) |>
  kable_styling(bootstrap_options = c("striped", "condensed"),
                full_width = FALSE)
Table 3: Data structure for the all data.
Studies Multi-treatment studies Multi-control studies Effects Mean Minimum Median Maximum Participants Preregistered studies
48 3 0 343 7.1 1 4.5 40 5527 23
Show the code
gb_dat |> 
  summarise(
    es_count = n(),
    .by = study
  ) |>  
  arrange(es_count) |> 
  ggplot(aes(x = es_count)) +
  geom_histogram(binwidth = 0.5, fill = met.brewer("Navajo")[4]) +
  scale_x_continuous(breaks = seq(0, 40, by = 5)) +
  scale_y_continuous(breaks = seq(0, 10, 2)) +
  theme_minimal() +
  labs(x = "Effect Size Estimates per Study", y = "Number of Studies")
Figure 29: Distribution of number of effect size estimates per study

Across outcome subgroups

Show the code
# Multi-arms studies
multi_arm_studies_reint <- 
  reintegration_dat |> 
  filter(trt_id > 1) |> 
  reframe(study = unique(study))
  

# Multi-time-points studies
follow_up_studies_reint <- 
  reintegration_dat |>
  summarise(
    time_points = length(unique(time_after_end_intervention_weeks)),
    .by = c(study, trt_id, ctr_id)
  ) |>
  filter(time_points > 1)

# Preregistered studies
prereg_studies_reint <- 
  reintegration_dat |> 
  summarise(
    prereg_chr = unique(prereg_chr),
    n_es = n(),
    .by = study
  ) |> 
  summarise(
    N_studies = n_distinct(study),
    N_es = sum(n_es),
    .by = prereg_chr
  )

study_sample_sizes_reint <- 
  reintegration_dat |>
  group_by(study, trt_id, ctr_id) |>
  summarise(
    effects = n(),
    participants = max(N_total)
  ) |>
  summarise(
    effects = sum(effects),
    participants = mean(participants),
    ctl_comparisons = n(),
    ctl_arms = paste(ctr_id, collapse = "; ")
  ) |>
  group_by(study, ctl_arms) |>
  summarise(
    effects = sum(effects),
    participants = mean(participants * (1 + ctl_comparisons * (n() - 1) / 2)),
    trt_comparisons = n(),
    trt_arms = paste(trt_id, collapse = "; "),
    ctl_comparisons = mean(ctl_comparisons)
  ) |>
  summarise(
    effects = sum(effects),
    participants = sum(participants),
    trt_comparisons = mean(trt_comparisons),
    ctl_comparisons = sum(ctl_comparisons)
  )

sample_size_summary_reint <-
  study_sample_sizes_reint |>
  summarise(
    studies = n(),
    studies_multiple_tx = sum(trt_comparisons > 1),
    studies_multiple_ctl = sum(ctl_comparisons > 1),
    n_effects = sum(effects),
    mean_effects = mean(effects),
    min_effects = min(effects),
    median_effects = median(effects),
    max_effects = max(effects),
    participants = round(sum(participants))
  ) |> 
  mutate(prereg = prereg_studies_reint$N_studies[1])

n_studies_reint <- sample_size_summary_reint$studies
Show the code
kable(
  sample_size_summary_reint,
  col.names = c(
    studies = "Studies",
    studies_multiple_tx = "Multi-treatment studies",
    studies_multiple_ctl = "Multi-control studies",
    n_effects = "Effects",
    mean_effects = "Mean",
    min_effects = "Minimum",
    median_effects = "Median",
    max_effects = "Maximum",
    participants = "Participants",
    prereg = "Preregistered studies"
  ),
  digits = 1
) |>
  kable_styling(bootstrap_options = c("striped", "condensed"),
                full_width = FALSE)
Table 4: Data structure for the reintegrational data.
Studies Multi-treatment studies Multi-control studies Effects Mean Minimum Median Maximum Participants Preregistered studies
45 3 0 202 4.5 1 3 28 5390 22
Show the code
# Multi-arms studies
multi_arm_studies_mental <- 
  mental_health_dat |> 
  filter(trt_id > 1) |> 
  reframe(study = unique(study))
  

# Multi-time-points studies
follow_up_studies_mental <- 
  mental_health_dat |>
  summarise(
    time_points = length(unique(time_after_end_intervention_weeks)),
    .by = c(study, trt_id, ctr_id)
  ) |>
  filter(time_points > 1)

# Preregistered studies
prereg_studies_mental <- 
  mental_health_dat |> 
  summarise(
    prereg_chr = unique(prereg_chr),
    n_es = n(),
    .by = study
  ) |> 
  summarise(
    N_studies = n_distinct(study),
    N_es = sum(n_es),
    .by = prereg_chr
  )

study_sample_sizes_mental <- 
  mental_health_dat |>
  group_by(study, trt_id, ctr_id) |>
  summarise(
    effects = n(),
    participants = max(N_total)
  ) |>
  summarise(
    effects = sum(effects),
    participants = mean(participants),
    ctl_comparisons = n(),
    ctl_arms = paste(ctr_id, collapse = "; ")
  ) |>
  group_by(study, ctl_arms) |>
  summarise(
    effects = sum(effects),
    participants = mean(participants * (1 + ctl_comparisons * (n() - 1) / 2)),
    trt_comparisons = n(),
    trt_arms = paste(trt_id, collapse = "; "),
    ctl_comparisons = mean(ctl_comparisons)
  ) |>
  summarise(
    effects = sum(effects),
    participants = sum(participants),
    trt_comparisons = mean(trt_comparisons),
    ctl_comparisons = sum(ctl_comparisons)
  )

sample_size_summary_mental <-
  study_sample_sizes_mental |>
  summarise(
    studies = n(),
    studies_multiple_tx = sum(trt_comparisons > 1),
    studies_multiple_ctl = sum(ctl_comparisons > 1),
    n_effects = sum(effects),
    mean_effects = mean(effects),
    min_effects = min(effects),
    median_effects = median(effects),
    max_effects = max(effects),
    participants = round(sum(participants))
  ) |> 
  mutate(prereg = prereg_studies_mental$N_studies[1])

n_studies_mental <- sample_size_summary_mental$studies
Show the code
kable(
  sample_size_summary_mental,
  col.names = c(
    studies = "Studies",
    studies_multiple_tx = "Multi-treatment studies",
    studies_multiple_ctl = "Multi-control studies",
    n_effects = "Effects",
    mean_effects = "Mean",
    min_effects = "Minimum",
    median_effects = "Median",
    max_effects = "Maximum",
    participants = "Participants",
    prereg = "Preregistered studies"
  ),
  digits = 1
) |>
  kable_styling(bootstrap_options = c("striped", "condensed"),
                full_width = FALSE)
Table 5: Data structure for the mental health data.
Studies Multi-treatment studies Multi-control studies Effects Mean Minimum Median Maximum Participants Preregistered studies
41 3 0 141 3.4 1 2 18 4663 20
Show the code
reintegration_dat |> 
  summarise(
    es_count = n(),
    .by = study
  ) |>  
  arrange(es_count) |> 
  ggplot(aes(x = es_count)) +
  geom_histogram(binwidth = 0.5, fill = "cornflowerblue") +
  scale_x_continuous(breaks = seq(0, 30, by = 5)) +
  scale_y_continuous(breaks = seq(0, 14, 2), limits = c(0, 14)) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(x = "Effect Size Estimates per Study", y = "Number of Studies", title = "Reintegration") +
  expand_limits(x = 30)
Figure 30: Distribution of number of effects per study for mental for reintegrational outcomes.
Show the code
mental_health_dat |> 
  summarise(
    es_count = n(),
    .by = study
  ) |>  
  arrange(es_count) |> 
  ggplot(aes(x = es_count)) +
  geom_histogram(binwidth = 0.5, fill = "gray") +
  scale_x_continuous(breaks = seq(0, 20, by = 5)) +
  scale_y_continuous(breaks = seq(0, 10, 2), limits = c(0, 11)) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(x = "Effect Size Estimates per Study", y = "Number of Studies", title = "Mental Health") +
  expand_limits(x = 20)
Figure 31: Distribution of number of effects per study for mental health outcomes.

Data structure by outcome constructs

Show the code
label_cat_hist_ridge <- function(data, n_es, variable, label_map, level_order) {
  require(dplyr)
  require(rlang)
  require(tidyr)
  require(ggplot2)
  require(forcats)
  
  n_es_exp <- enquo(n_es)
  var_exp <- enquo(variable)
  
  data <- data |> 
    mutate(
      !!var_exp := fct_recode(!!var_exp, !!!label_map),
      !!var_exp := fct_relevel(!!var_exp, !!!level_order),
      !!var_exp := fct_rev(!!var_exp)
    ) 
  
  ggplot(data, aes(
    x = !!n_es_exp,
    y = !!var_exp,
    fill = !!var_exp
  )) +
    geom_density_ridges(
      alpha = 1,
      stat = "binline",
      bins = 30,
      scale = 0.7,
      linewidth = 0.1,
      draw_baseline = FALSE
    ) +
    theme_minimal() +
    labs(y = "", x = "Effect Size Estimates per Study") +
    theme(legend.position = "none")
}

The following plot shows the effect size estimates distribution within each outcome construct.

Show the code
n_es_by_construct <- 
  gb_dat |> 
  filter(str_detect(outcome_construct, "Re")) |> 
  summarise(effects = n(), .by = c(study, analysis_plan)) |> 
  mutate(J = n(), .by = c(analysis_plan)) |> 
  arrange(desc(J)) 

# Used to construct out_label 
#label_dat <- 
#  n_es_by_construct |> 
#  summarise(J = n(), N_es = sum(effects), .by = analysis_plan)


out_label <- c(
  "Wellbeing and quality of life (J = 24, K = 67)" = "Wellbeing and quality of life",
  "Social functioning (degree of impairment) (J =16, K = 47)" = "Social functioning (degree of impairment)",
  "Hope, empowerment & self-efficacy (J = 12, K = 32)" = "Hope, empowerment & self-efficacy",
  "Alcohol and drug abuse/misuse (J = 7, K = 31)" = "Alcohol and drug abuse/misuse",
  "Self-esteem (J = 5, K = 14)" = "Self-esteem",
  "Loneliness (J = 4, K = 5)" = "Loneliness",
  "Physical health (J = 2, K = 3)" = "Physical health",
  "Psychiatric hospitalization (J = 1, K = 1)" = "Psychiatric hospitalization",
  "Employment (J = 1, K = 2)" = "Employment"
)

out_level <- c(
 "Wellbeing and quality of life (J = 24, K = 67)",
  "Social functioning (degree of impairment) (J =16, K = 47)",
  "Hope, empowerment & self-efficacy (J = 12, K = 32)",
  "Alcohol and drug abuse/misuse (J = 7, K = 31)",
  "Self-esteem (J = 5, K = 14)",
  "Loneliness (J = 4, K = 5)",
  "Physical health (J = 2, K = 3)",
  "Psychiatric hospitalization (J = 1, K = 1)",
  "Employment (J = 1, K = 2)"
)

label_cat_hist_ridge(
  data = n_es_by_construct, 
  n_es = effects, 
  variable = analysis_plan, 
  label_map = out_label, 
  level_order = out_level
) + 
  expand_limits(x = 20) + 
  labs(title = "Reintegrational outcomes") + 
  theme(plot.title = element_text(hjust = 0.5))
Figure 32: Distribution of effect size estimates, by reintegrational outcome constructs.
Show the code
n_es_by_construct_mental <- 
  gb_dat |> 
  filter(str_detect(outcome_construct, "Men")) |> 
  summarise(effects = n(), .by = c(study, analysis_plan)) |> 
  mutate(J = n(), .by = c(analysis_plan)) |> 
  arrange(desc(J)) 

# Used to construct out_label_mental 
#label_dat_mental <- 
#  n_es_by_construct_mental |> 
#  summarise(J = n(), N_es = sum(effects), .by = analysis_plan)

out_label_mental <- c(
  "General mental health (J = 28, K = 70)" = "General mental health",
  "Depression (J = 19, K = 36)" = "Depression",
  "Anxiety (J = 9, K = 14)" = "Anxiety",
  "Symptoms of psychosis (J = 7, K = 21)" = "Symptoms of psychosis"
)

out_level_mental <- c(
  "General mental health (J = 28, K = 70)",
  "Depression (J = 19, K = 36)",
  "Anxiety (J = 9, K = 14)",
  "Symptoms of psychosis (J = 7, K = 21)"
)

label_cat_hist_ridge(
  data = n_es_by_construct_mental, 
  n_es = effects, 
  variable = analysis_plan, 
  label_map = out_label_mental, 
  level_order = out_level_mental
) + 
  expand_limits(x = 15) + 
  labs(title = "Mental heath outcomes") + 
  theme(plot.title = element_text(hjust = 0.5))
Figure 33: Distribution of effect size estimates, by mental health outcome constructs.

Primary study sample size

Total sample sizes

Show the code
# Used when describing the treatment group sample sizes
N_t_stud_trtid <- 
  reintegration_dat |> 
  reframe(N_treat = max(N_t), .by = c(study, trt_id)) 

N_t_total <- 
  N_t_stud_trtid |> 
  summarise(N_t_total = sum(N_treat), .by = study)

N_c_total <- 
  reintegration_dat |> 
  summarise(N_c_total = max(N_c), .by = study)

N_total_dat <- 
  left_join(N_t_total, N_c_total, by = join_by(study)) |> 
  mutate(N_total = N_t_total + N_c_total)


primary_sample_size_descriptive <- 
  N_total_dat$N_total |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) 

primary_sample_size_descriptive |>
  knitr::kable(
    digits = 2,
    booktabs = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Table 6: Distribution of primary study sample sizes at post test for reintegrational outcomes
mean sd p0 p25 p50 p75 p100
119.78 127.69 17 41 61 137 631
Show the code
# Used when describing the treatment group sample sizes
N_t_stud_trtid_mental <- 
  mental_health_dat |> 
  reframe(N_treat = max(N_t), .by = c(study, trt_id)) 

N_t_total_mental <- 
  N_t_stud_trtid_mental |> 
  summarise(N_t_total = sum(N_treat), .by = study)

N_c_total_mental <- 
  mental_health_dat |> 
  summarise(N_c_total = max(N_c), .by = study)

N_total_dat_mental <- 
  left_join(N_t_total_mental, N_c_total_mental, by = join_by(study)) |> 
  mutate(N_total = N_t_total + N_c_total)


primary_sample_size_descriptive_mental <- 
  N_total_dat_mental$N_total |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) 

primary_sample_size_descriptive_mental |>
  knitr::kable(
    digits = 2,
    booktabs = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Table 7: Distribution of primary study sample sizes at post test for mental health outcomes
mean sd p0 p25 p50 p75 p100
113.73 125.6 17 40 61 128 631

The following plot displays the distribution of study sample sizes at post-test.

Show the code
study_sizes_plot_reint <- 
  ggplot(N_total_dat, aes(N_total)) + 
  geom_density(fill = "cornflowerblue", alpha = 0.8) + 
  geom_blank(aes(x = 0, y = 0)) + 
  geom_rug(alpha = 0.8) +
  scale_y_continuous(NULL, breaks = NULL) + 
  theme_minimal() + 
  labs(x = "Total Sample Size", y = "")
study_sizes_plot_reint
Figure 34: Distribution of primary study sample sizes at post test for reintegrational outcomes.
Show the code
study_sizes_plot_mental <- 
  ggplot(N_total_dat_mental, aes(N_total)) + 
  geom_density(fill = "gray", alpha = 0.8) + 
  geom_blank(aes(x = 0, y = 0)) + 
  geom_rug(alpha = 0.8) +
  scale_y_continuous(NULL, breaks = NULL) + 
  theme_minimal() + 
  labs(x = "Total Sample Size", y = "")
study_sizes_plot_mental
Figure 35: Distribution of primary study sample sizes at post test for mental health outcomes.

Treatment group

Show the code
treatment_sample_size_descriptive <- 
  N_t_stud_trtid$N_treat |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) 

treatment_sample_size_descriptive |>
  knitr::kable(
    digits = 2,
    booktabs = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Table 8: Distribution of treatment sample sizes at post test for reintegrational outcomes
mean sd p0 p25 p50 p75 p100
60.88 60.32 8 22.75 33.5 90.25 315
Show the code
treatment_sample_size_descriptive_mental <- 
  N_t_stud_trtid_mental$N_treat |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) 

treatment_sample_size_descriptive_mental |>
  knitr::kable(
    digits = 2,
    booktabs = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Table 9: Distribution of treatment sample sizes at post test for mental health outcomes
mean sd p0 p25 p50 p75 p100
57.8 59.09 8 21 30 75 315

The following plot displays the distribution of treatment sample sizes at post-test.

Show the code
treatment_sizes_plot_reint <- 
  ggplot(N_t_stud_trtid, aes(N_treat)) + 
  geom_density(fill = "cornflowerblue", alpha = 0.8) + 
  geom_blank(aes(x = 0, y = 0)) + 
  geom_rug(alpha = 0.8) +
  scale_y_continuous(NULL, breaks = NULL) + 
  theme_minimal() + 
  labs(x = "Total Treatment Sample Size", y = "")
treatment_sizes_plot_reint
Figure 36: Distribution of treatment sample sizes at post test for reintegrational outcomes.
Show the code
treatment_sizes_plot_mental <- 
  ggplot(N_t_stud_trtid_mental, aes(N_treat)) + 
  geom_density(fill = "gray", alpha = 0.8) + 
  geom_blank(aes(x = 0, y = 0)) + 
  geom_rug(alpha = 0.8) +
  scale_y_continuous(NULL, breaks = NULL) + 
  theme_minimal() + 
  labs(x = "Total Treatment Sample Size", y = "")
treatment_sizes_plot_mental
Figure 37: Distribution of treatment sample sizes at post test for mental health outcomes.

Control group

Show the code
control_sample_size_descriptive <- 
  N_total_dat$N_c_total |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) 

control_sample_size_descriptive |>
  knitr::kable(
    digits = 2,
    booktabs = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Table 10: Distribution of control group sample sizes at post test for reintegrational outcomes
mean sd p0 p25 p50 p75 p100
54.84 60.5 9 19 30 63 316
Show the code
control_sample_size_descriptive_mental <- 
  N_total_dat_mental$N_c_total |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) 

control_sample_size_descriptive_mental |>
  knitr::kable(
    digits = 2,
    booktabs = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Table 11: Distribution of control group sample sizes at post test for mental health outcomes
mean sd p0 p25 p50 p75 p100
51.71 58.61 9 20 29 63 316

The following plot displays the distribution of control sample sizes at post-test.

Show the code
control_sizes_plot_reint <- 
  ggplot(N_total_dat, aes(N_c_total)) + 
  geom_density(fill = "cornflowerblue", alpha = 0.8) + 
  geom_blank(aes(x = 0, y = 0)) + 
  geom_rug(alpha = 0.8) +
  scale_y_continuous(NULL, breaks = NULL) + 
  theme_minimal() + 
  labs(x = "Total Control Group Sample Size", y = "")
control_sizes_plot_reint
Figure 38: Distribution of control group sample sizes at post test for reintegrational outcomes.
Show the code
control_sizes_plot_mental <- 
  ggplot(N_total_dat_mental, aes(N_c_total)) + 
  geom_density(fill = "gray", alpha = 0.8) + 
  geom_blank(aes(x = 0, y = 0)) + 
  geom_rug(alpha = 0.8) +
  scale_y_continuous(NULL, breaks = NULL) + 
  theme_minimal() + 
  labs(x = "Total Control Group Sample Size", y = "")
control_sizes_plot_mental
Figure 39: Distribution of control group sample sizes at post test for mental health outcomes.

Study sample sizes versus number of effect size estimates per study

Show the code
plot <- 
  reintegration_dat |> 
  summarise(effects = n(), .by = study) |> 
  left_join(N_total_dat, by = join_by(study)) |> 
  relocate(effects, .after = N_total) |> 
  ggplot(aes(x = N_total, y = effects)) +
  geom_point(alpha = 0.5) +
  scale_x_continuous(breaks = seq(0, 650, by = 50)) +
  guides(size = "none") + 
  theme_minimal() +
  theme(
    legend.position = "inside",
    legend.position.inside = c(0.9, 0.05),
    legend.justification = c(1, 0),
    legend.background = element_blank()
  ) +
  labs(x = "Total sample size", y = "Number of effect size estimates per study", color = "") +
  expand_limits(y = 30)

ggMarginal(plot, type = "density")
Figure 40: Study sample sizes versus number of effect size estimates for reintegrational outcomes

Moderators

Show the code
cat_dat_cross <- function(variable, study_id, data) {
  
  require(dplyr)
  require(rlang)
  require(tidyr)
  
  var_exp <- enquo(variable)
  study_id_exp <- enquo(study_id)
  study_id_name <- as_name(study_id_exp)
  
  
    res_dat <- data %>%
      group_by(!!study_id_exp) %>%
      reframe(var_exp_mirror = unique(!!var_exp))  %>%
      full_join(data,
                by = c(study_id_name),
                relationship = "many-to-many") %>%
      group_by(!!var_exp, var_exp_mirror) %>%
      reframe(
        m = n_distinct(!!study_id_exp),
        k = n()
      ) %>%
      mutate(size = paste0(m, " (", k, ")")) %>%
      select(-m, -k) |>
      pivot_wider(names_from = var_exp_mirror, values_from = "size")
  
  names(res_dat)[1] <- "level" 
  
  res_dat <- 
    res_dat |> 
    mutate(
      level = factor(level, levels = unique(names(res_dat[-1])))
    ) |> 
    arrange(level)

  return(res_dat)
}

Categorical moderators

Outcome measure

Show the code
outcome_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = analysis_plan,
  study_id = study
)


outcome_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Outcome",
      colnames(outcome_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.",
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 12: Dependency table for preregistration status (reintegration)
Outcome Alcohol and drug abuse/misuse Hope, empowerment & self-efficacy Physical health Social functioning (degree of impairment) Wellbeing and quality of life Employment Self-esteem Loneliness Psychiatric hospitalization
Alcohol and drug abuse/misuse 7 (31) 1 (2) 1 (1) 3 (4) 2 (3) - - - -
Hope, empowerment & self-efficacy 1 (1) 12 (32) - 1 (2) 6 (14) 1 (6) 3 (15) 1 (4) 1 (1)
Physical health 1 (1) - 2 (3) 2 (3) - - - - -
Social functioning (degree of impairment) 3 (7) 1 (2) 2 (5) 16 (47) 7 (30) - - - -
Wellbeing and quality of life 2 (3) 6 (12) - 7 (34) 24 (67) - 2 (2) 2 (3) -
Employment - 1 (2) - - - 1 (2) 1 (2) - -
Self-esteem - 3 (5) - - 2 (2) 1 (2) 5 (14) - -
Loneliness - 1 (2) - - 2 (3) - - 4 (5) -
Psychiatric hospitalization - 1 (1) - - - - - - 1 (1)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
outcome_subgroup_dat_cross <- cat_dat_cross(
  data = filter(reintegration_dat, str_detect(analysis_plan, "Alco|Hope|Social|Well")),
  variable = analysis_plan,
  study_id = study
)


outcome_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Outcome",
      colnames(outcome_subgroup_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 13: Dependency table for outcome used for subgroup analysis (reintegration)
Outcome Alcohol and drug abuse/misuse Hope, empowerment & self-efficacy Social functioning (degree of impairment) Wellbeing and quality of life
Alcohol and drug abuse/misuse 7 (31) 1 (2) 3 (4) 2 (3)
Hope, empowerment & self-efficacy 1 (1) 12 (32) 1 (2) 6 (14)
Social functioning (degree of impairment) 3 (7) 1 (2) 16 (47) 7 (30)
Wellbeing and quality of life 2 (3) 6 (12) 7 (34) 24 (67)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
outcome_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = analysis_plan,
  study_id = study
)


outcome_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Outcome",
      colnames(outcome_subgroup_dat_cross_mental)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 14: Dependency table for outcome used for subgroup analysis (mental health)
Outcome Anxiety Depression General mental health Symptoms of psychosis
Anxiety 9 (14) 7 (11) 5 (9) -
Depression 7 (10) 19 (36) 10 (21) 2 (4)
General mental health 5 (13) 10 (27) 28 (70) 2 (3)
Symptoms of psychosis - 2 (8) 2 (3) 7 (21)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Ridge plot of effect size estimates
Show the code
cat_ridge <- function(data, es, v, variable) {
  require(dplyr)
  require(rlang)
  require(tidyr)
  require(ggplot2)
  
  es_exp <- enquo(es)
  var_exp <- enquo(variable)
  v_exp <- enquo(v)
  
  data |> 
    mutate(!!var_exp := fct_rev(!!var_exp)) |> 
  ggplot(aes(
    x = !!es_exp,
    y = !!var_exp,
    fill = !!var_exp
  )) +
    geom_density_ridges(
      aes(
        point_colour = !!var_exp,
        point_size = 1 / !!v_exp
      ),
      alpha = .2,
      point_alpha = 0.5,
      jittered_points = TRUE
    ) +
    theme_minimal() +
    labs(y = "", x = "Standardized Mean Difference (Hedges' g)") +
    theme(legend.position = "none")
}
Show the code
analyzed_outcomes <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Alco|Hope|Social|Well"))

cat_ridge(data = analyzed_outcomes, es = gt_pop, variable = analysis_plan, v = vgt_pop)
Figure 41: Distribution of effect size estimates, by reintegrational outcomes
Show the code
not_analyzed_outcomes <- 
  reintegration_dat |> 
  filter(!str_detect(analysis_plan, "Alco|Hope|Social|Well"))

cat_ridge(data = not_analyzed_outcomes, es = gt_pop, variable = analysis_plan, v = vgt_pop)
Figure 42: Distribution of effect size estimates, by reintegrational outcomes.
Show the code
cat_ridge(data = mental_health_dat, es = gt_pop, variable = analysis_plan, v = vgt_pop)
Figure 43: Distribution of effect size estimates, by mental health outcomes.
Network plot for outcome construct

The following plot shows the network structure of outcomes constructs. Each node represent an outcome construct, the edge between a pair of nodes indicates that there is at least one study that examined the contracts between that pair of constructs The width of the edges indicates the number of studies that compare that pair of constructs. The size of the node corresponds to the number of studies measure that construct.

Show the code
gb_dat_reduced <- gb_dat |> select(study, analysis_plan)

res_dat <- gb_dat_reduced |> 
  group_by(study) |>
  reframe(var_exp_mirror = unique(analysis_plan))  |>
  full_join(gb_dat_reduced ,
            by = join_by(study),
            relationship = "many-to-many") |>
  group_by(analysis_plan, var_exp_mirror) |>
  reframe(
    m = n_distinct(study),
    k = n()
  ) |>
  mutate(size = m) |> 
  select(-m, -k) |>
  arrange(var_exp_mirror) |> 
  pivot_wider(names_from = var_exp_mirror, values_from = "size") |> 
  arrange(analysis_plan) |> 
  as.data.frame()


names(res_dat)[1] <- "level"


edges <- res_dat  |>
  rename(from = "level") |> 
  pivot_longer(-from, names_to = "to", values_to = "weight") |>
  filter(from != to, !is.na(weight)) |> 
  mutate(
    from_chr = as.character(from),
    to_chr = as.character(to),
    grp_str = paste0(pmin(from_chr, to_chr, na.rm = TRUE), "_", pmax(from_chr, to_chr, na.rm = TRUE))
  ) |> 
  distinct(grp_str, .keep_all = TRUE) |>
  select(from, to, weight)

g <- graph_from_data_frame(edges, directed = FALSE)
layout <- layout_in_circle(g)

# Adjust label position outward
label_coords <- layout
label_coords[, 1] <- c(
  label_coords[1, 1] * 1.35, #1.5,
  label_coords[2:6, 1] * 1.5, #1.63,
  label_coords[7, 1] * 1.35, #1.68,
  label_coords[8:13, 1] * 1.4 #1.63
)

label_coords[, 2] <- c(
  label_coords[c(1:3), 2],
  label_coords[4, 2] * 1.13,
  label_coords[5, 2] * 1.3,
  label_coords[6, 2] * 1.13,
  label_coords[c(7:9), 2] * 1.13,
  label_coords[10, 2] * 1.3,
  label_coords[11, 2] * 1.3,
  label_coords[12, 2] * 1.3,
  label_coords[13, 2] * 1.13
)

node_sizes <- diag(as.matrix(res_dat[, -1]))

plot(
  g,
  layout = layout,
  edge.width = E(g)$weight,
  edge.color = met.brewer("Navajo")[5],
  vertex.size = node_sizes[c(1:8, 10:13, 9)],
  vertex.label = NA,
  vertex.color = met.brewer("Navajo")[4],
  vertex.frame.width = 0
)

text(
  x = label_coords[, 1],
  y = label_coords[, 2],
  labels = paste0(str_wrap(names(res_dat[c(2:9, 11:14, 10)]), width = 15), "\n(J = ", node_sizes, ")"),
  cex = 0.6,
  col = "black",
  xpd = NA
)
Figure 44: Network structure of contrasts between primary and secondary outcome constructs

Diagnosis (schizophrenia vs. rest of the effects)

Show the code
diagnosis_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = schizophrenia,
  study_id = study
)

diagnosis_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Diagnosis",
      colnames(diagnosis_subgroup_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 15: Dependency table for diagnosis (reintegration)
Diagnosis Other Schizophrenia
Other 37 (172) -
Schizophrenia - 8 (30)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
diagnosis_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = schizophrenia,
  study_id = study
)

diagnosis_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Diagnosis",
      colnames(diagnosis_subgroup_dat_cross_mental)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 16: Dependency table for diagnosis (mental health)
Diagnosis Other Schizophrenia
Other 35 (130) -
Schizophrenia - 6 (11)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = schizophrenia, v = vgt_pop)
Figure 45: Distribution of effect size estimates, by diagnosis (reintegrational outcome).
Show the code
cat_ridge(data = mental_health_dat, es = gt_pop, variable = schizophrenia, v = vgt_pop)
Figure 46: Distribution of effect size estimates, by diagnosis (mental health).

Type of intervention

Show the code
cbt_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = CBT_int,
  study_id = study
)

cbt_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Intervention",
      colnames(cbt_subgroup_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 17: Dependency table for type of intervention (reintegration)
Intervention CBT Other
CBT 11 (52) 1 (5)
Other 1 (5) 35 (150)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
cbt_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = CBT_int,
  study_id = study
)

cbt_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Intervention",
      colnames(cbt_subgroup_dat_cross_mental)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 18: Dependency table for type of intervention (mental health)
Intervention CBT Other
CBT 11 (46) 1 (2)
Other 1 (2) 31 (95)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = CBT_int, v = vgt_pop)
Figure 47: Distribution of effect size estimates, by type of intervention (reintegrational outcome).
Show the code
cat_ridge(data = mental_health_dat, es = gt_pop, variable = CBT_int, v = vgt_pop)
Figure 48: Distribution of effect size estimates, by type of intervention (mental health).

EGM-like plot

Show the code
egm_dat_reint <- 
  reintegration_dat |> 
  summarise(
    n = n(),
    n_studies = factor(n_distinct(study), levels = c(1:4)),
    .by = c(trt_group, analysis_plan, prereg_chr)
  ) |> 
  mutate(
    n_prereg = case_match(
      prereg_chr,
      "Preregistered" ~ 0.5,
      "Not preregistered" ~ 0
    ),
    
    constant = "Intervention",
    
    outcome = case_match(
      analysis_plan,
      "Alcohol and drug abuse/misuse" ~ "Alcohol/drugs",
      "Hope, empowerment & self-efficacy" ~ "Hope",
      "Psychiatric hospitalization" ~ "Psych hospital",
      "Social functioning (degree of impairment)" ~ "Social func",
      "Wellbeing and quality of life" ~ "Wellbeing/QoL",
      .default = analysis_plan
    ),
    
    intervention = case_match(
      trt_group,
      "group-based CBT" ~ "GrpCBT",
      "stress management" ~ "StressMan",
      "vocational training" ~ "JobTrain",
      "group psychotherapy"  ~ "GrpPsychT",
      "art therapy" ~ "ArtT",
      "illness management" ~ "IllMan",
      "group psychoeducation" ~ "GrpPsychEdu",
      "seeking safety" ~ "SeekSafe",
      "social cognition and interaction training" ~ "SCIT",
      "illness and addiction management" ~ "Ill&AddMan",
      "social network training" ~ "NetworkTrain",
      "cognitive-behavioral social skills training" ~ "CBSST",
      "residential treatment" ~ "ResidentTreat",
      "positive psychology group intervention" ~ "PosiPsychGrp",
      "addiction management" ~ "AddMan",
      "reading group intervention" ~ "ReadGrp"
    )
    
    
    #intervention_name = case_match(
    #  intervention,
    #  "Sanctions and economic incentives" ~ "Econ incentives",
    #  "Introduction programmes" ~ "Intro program",
    #  "Combination programmes" ~ "Combi program",
    #  "Language training" ~ "Lang train",
    #  "Labour market training" ~ "Lab market train",
    #  "Job search assistance" ~" Job search ass",
    #  "Subsidized public sector employment" ~ "Sub public emp"
    #),
    #
    #outcome = if_else(outcome == "Duration of social assistance spells", "Dur. social ass spells", outcome)
    
  ) 

egm_dat_reint |> 
  ggplot(aes(x = n_prereg, y =  constant, size = n, color = n_studies)) + 
  geom_point() +
  scale_size(range = c(6, 14)) +
  geom_text(aes(label = n), color = "black", size = 3.5) +
  scale_x_continuous(breaks = seq(0,0.5,0.5), limits = c(0, 1), labels = c("Conventional", "Preregistered")) +
  scale_y_discrete("Interventions") +
  facet_grid(intervention~outcome, scales = "free_y", space = "free_y") +
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.text.x = element_text(angle = 45, hjust = 1),
    #panel.grid.major = element_blank(),
    #panel.grid.minor = element_blank(),
    #panel.background = element_blank(),
    axis.text.y = element_blank(),   
    axis.ticks.y = element_blank(),  
    axis.title.y = element_blank(),
    plot.caption = element_text(hjust = 0, size = 14)
  ) +
  coord_cartesian(xlim = c(-0.25, 0.75), ylim = NULL) +
  guides(size = "none") + 
  xlab("Type of registration") +
  labs(
    color = "Number of studies",
    caption = paste0(
      "Note: GrpCBT = Group-based CBT, StressMan = Stress mangement, JobTrain = Vocational training, ",
      "GrpPsychT = Group psychotherapy, ArtT = Art Therapy, IllMan = Ill management,\n",
      "GrpPsychEdu = Group Psychoeducation, SeekSafe = Seeking safety, ",
      "SCIT = cognitive-behavioral social skills training, ResidentTreat = Residential treatment,\n",
      "PosiPsychGrp = Positive Psychology group therapy, AddMan = Addiction mangement, ",
      "ReadGrp = Reading group."
    )
  )
Figure 49: EGM for reintegrational outcomes
Show the code
egm_dat_mental <- 
  mental_health_dat |> 
  summarise(
    n = n(),
    n_studies = factor(n_distinct(study), levels = c(1:4)),
    .by = c(trt_group, analysis_plan, prereg_chr)
  ) |> 
  mutate(
    n_prereg = case_match(
      prereg_chr,
      "Preregistered" ~ 0.5,
      "Not preregistered" ~ 0
    ),
    
    constant = "Intervention",
    
    outcome = analysis_plan,
    
    intervention = case_match(
      trt_group,
      "group-based CBT" ~ "GrpCBT",
      "stress management" ~ "StressMan",
      "vocational training" ~ "JobTrain",
      "group psychotherapy"  ~ "GrpPsychT",
      "art therapy" ~ "ArtT",
      "illness management" ~ "IllMan",
      "group psychoeducation" ~ "GrpPsychEdu",
      "seeking safety" ~ "SeekSafe",
      "social cognition and interaction training" ~ "SCIT",
      "illness and addiction management" ~ "Ill&AddMan",
      "social network training" ~ "NetworkTrain",
      "cognitive-behavioral social skills training" ~ "CBSST",
      "residential treatment" ~ "ResidentTreat",
      "positive psychology group intervention" ~ "PosiPsychGrp",
      "addiction management" ~ "AddMan",
      "reading group intervention" ~ "ReadGrp",
      "group psychoeducation & social skill training" ~ "GrpPsyEdu&SS"
    )
    
    
    #intervention_name = case_match(
    #  intervention,
    #  "Sanctions and economic incentives" ~ "Econ incentives",
    #  "Introduction programmes" ~ "Intro program",
    #  "Combination programmes" ~ "Combi program",
    #  "Language training" ~ "Lang train",
    #  "Labour market training" ~ "Lab market train",
    #  "Job search assistance" ~" Job search ass",
    #  "Subsidized public sector employment" ~ "Sub public emp"
    #),
    #
    #outcome = if_else(outcome == "Duration of social assistance spells", "Dur. social ass spells", outcome)
    
  ) 

egm_dat_mental |> 
  ggplot(aes(x = n_prereg, y =  constant, size = n, color = n_studies)) + 
  geom_point() +
  scale_size(range = c(6, 14)) +
  geom_text(aes(label = n), color = "black", size = 3.5) +
  scale_x_continuous(breaks = seq(0,0.5,0.5), limits = c(0, 1), labels = c("Conventional", "Preregistered")) +
  scale_y_discrete("Interventions") +
  facet_grid(intervention~outcome, scales = "free_y", space = "free_y") +
  theme_bw() + 
  theme(
    legend.position = "bottom",
    axis.text.x = element_text(angle = 45, hjust = 1),
    #panel.grid.major = element_blank(),
    #panel.grid.minor = element_blank(),
    #panel.background = element_blank(),
    axis.text.y = element_blank(),   
    axis.ticks.y = element_blank(),  
    axis.title.y = element_blank(),
    plot.caption = element_text(hjust = 0, size = 12)
  ) +
  coord_cartesian(xlim = c(-0.25, 0.75), ylim = NULL) +
  guides(size = "none") + 
  xlab("Type of registration") +
  labs(
    color = "Number of studies",
    caption = paste0(
      "Note: GrpCBT = Group-based CBT, StressMan = Stress mangement, JobTrain = Vocational training,",
      "GrpPsychT = Group psychotherapy, ArtT = Art Therapy,\nIllMan = Ill management,",
      "GrpPsychEdu = Group Psychoeducation, SeekSafe = Seeking safety,",
      "SCIT = cognitive-behavioral social skills training,\nResidentTreat = Residential treatment,",
      "PosiPsychGrp = Positive Psychology group therapy, AddMan = Addiction mangement, ",
      "ReadGrp = Reading group,\nGrpPsyEdu&SS = Group psychoeducation & social skill training."
    )
  )
Figure 50: EGM for mental health outcomes

Type of test

Show the code
test_type_dat <- 
  reintegration_dat |> 
  filter(test_type != "Raw events")

test_type_dat_cross <- cat_dat_cross(
  data = test_type_dat,
  variable = test_type,
  study_id = study
)

test_type_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Type of test",
      colnames(test_type_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 19: Dependency table for type of test (reintegration)
Type of test Clinician-rated measure Self-reported
Clinician-rated measure 12 (36) 5 (8)
Self-reported 5 (8) 38 (165)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
test_type_dat_mental <- 
  mental_health_dat |> 
  filter(test_type != "Raw events")


test_type_dat_cross_mental <- cat_dat_cross(
  data = test_type_dat_mental,
  variable = test_type,
  study_id = study
)

test_type_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Type of test",
      colnames(test_type_dat_cross_mental)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 20: Dependency table for type of test (mental health)
Type of test Clinician-rated measure Self-reported
Clinician-rated measure 14 (41) 5 (11)
Self-reported 5 (18) 32 (100)
Note: Values outside the parentheses are number of studies, with the number of samples and effect size estimates shown in the parentheses.
Show the code
cat_ridge(data = test_type_dat, es = gt_pop, variable = test_type, v = vgt_pop)
Figure 51: Distribution of effect size estimates, by type of test (reintegrational outcome).
Show the code
cat_ridge(data = test_type_dat_mental, es = gt_pop, variable = test_type, v = vgt_pop)
Figure 52: Distribution of effect size estimates, by type of test (mental health).
Show the code
test_type_dat_all <- 
  gb_dat |> 
  filter(test_type != "Raw events") |> 
  mutate(
    p_val = 2 * ( 1 - pnorm( abs(gt_pop) / sqrt(vgt_pop) ) ),
  )


ggplot(test_type_dat_all, aes(y = gt_pop, x = p_val, color = test_type)) +
geom_point() + 
geom_hline(yintercept = 0) + 
geom_vline(xintercept = .05, color = "gray") +
facet_grid(outcome_construct~test_type) +
theme_bw() +
theme(legend.position="none") +
labs(x = "p values", y = "Effect sizes (Hedges' g)")
Figure 53: Distributions of effect size by p values and outcome measure type.

ITT vs. TOT

Show the code
strategy_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = analysis_strategy,
  study_id = study
)

strategy_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Strategy",
      colnames(strategy_subgroup_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses. ",
                     "TOT = treatment on the treated, ITT = Intention to treat."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 21: Dependency table for estimation strategy (reintegration)
Strategy ITT TOT
ITT 22 (108) -
TOT - 23 (94)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses. TOT = treatment on the treated, ITT = Intention to treat.
Show the code
strategy_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = analysis_strategy,
  study_id = study
)

strategy_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Strategy",
      colnames(strategy_subgroup_dat_cross_mental)[-1]
    ) 
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses. ",
                     "TOT = treatment on the treated, ITT = Intention to treat."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  )  |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 22: Dependency table for estimation strategy (mental health)
Strategy ITT TOT
ITT 18 (69) -
TOT - 23 (72)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses. TOT = treatment on the treated, ITT = Intention to treat.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = analysis_strategy, v = vgt_pop)
Figure 54: Distribution of effect size estimates, by estiamtion strategy (reintegrational outcome).
Show the code
cat_ridge(data = mental_health_dat, es = gt_pop, variable = analysis_strategy, v = vgt_pop)
Figure 55: Distribution of effect size estimates, by estiamtion strategy (mental health).

RCT vs. QES

Show the code
design_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = QES_design,
  study_id = study
)

design_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Design",
      colnames(design_subgroup_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 23: Dependency table for type of research design (reintegration)
Design QES RCT
QES 8 (18) -
RCT - 37 (184)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
design_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = QES_design,
  study_id = study
)

design_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Design",
      colnames(design_subgroup_dat_cross_mental)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  )  |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 24: Dependency table for type of research design (mental health)
Design QES RCT
QES 8 (17) -
RCT - 33 (124)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = QES_design, v = vgt_pop)
Figure 56: Distribution of effect size estimates, by research design (reintegrational outcome).
Show the code
cat_ridge(data = mental_health_dat, es = gt_pop, variable = QES_design, v = vgt_pop)
Figure 57: Distribution of effect size estimates, by research design (mental health).

Type of control

Show the code
control_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = control,
  study_id = study
)

control_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Control",
      colnames(control_subgroup_dat_cross)[-1]
    ) 
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    paste0(
      "Values outside the parentheses are number of studies,", "
       with the number of samples and effect size estimates shown in the parentheses."
    ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 25: Dependency table for type of control group (reintegration)
Control Individual treatment TAU TAU with Waiting-list Waiting-list only
Individual treatment 3 (4) - - -
TAU - 30 (154) - -
TAU with Waiting-list - - 8 (31) -
Waiting-list only - - - 4 (13)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
control_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = control,
  study_id = study
)

control_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Control",
      colnames(control_subgroup_dat_cross_mental)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = "See note in the reintegration table to the left.", 
    general_title = "Note: ",
    footnote_as_chunk = T
  )  |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 26: Dependency table for type of control group (mental health)
Control Individual treatment TAU TAU with Waiting-list Waiting-list only
Individual treatment 2 (3) - - -
TAU - 28 (108) - -
TAU with Waiting-list - - 8 (23) -
Waiting-list only - - - 3 (7)
Note: See note in the reintegration table to the left.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = control, v = vgt_pop)
Figure 58: Distribution of effect size estimates, by type of control group (reintegrational outcome).
Show the code
cat_ridge(data = mental_health_dat, es = gt_pop, variable = control, v = vgt_pop)
Figure 59: Distribution of effect size estimates, by type of control group (mental health).

Risk of bias (RoB)

Show the code
rob_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = overall_rob,
  study_id = study
)

rob_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Risk of bias judgment",
      colnames(rob_subgroup_dat_cross)[-1]
    ) 
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 27: Dependency table across overall risk of bias assessments (reintegration)
Risk of bias judgment Low Some concerns/Moderate Serious/High
Low 10 (69) - -
Some concerns/Moderate - 21 (94) 1 (1)
Serious/High - 1 (1) 15 (39)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
rob_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = overall_rob,
  study_id = study
)

rob_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Risk of bias judgment",
      colnames(rob_subgroup_dat_cross_mental)[-1]
    ) 
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  )  |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 28: Dependency table across overall risk of bias assessments (mental health)
Risk of bias judgment Low Some concerns/Moderate Serious/High
Low 10 (36) - -
Some concerns/Moderate - 20 (79) 1 (2)
Serious/High - 1 (2) 12 (26)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = overall_rob, v = vgt_pop)
Figure 60: Distribution of effect size estimates, by overall risk of bias assessment (reintegrational outcome).
Show the code
cat_ridge(data = gb_dat, es = gt_pop, variable = overall_rob, v = vgt_pop) 
Figure 61: Distribution of effect size estimates, by overall risk of bias assessment (mental health).

Preregistered vs. not preregistered studies

Show the code
prereg_subgroup_dat_cross <- cat_dat_cross(
  data = reintegration_dat,
  variable = prereg_chr,
  study_id = study
)

prereg_subgroup_dat_cross |>
  knitr::kable(
    "html",
    col.names = c(
      "Registration",
      colnames(prereg_subgroup_dat_cross)[-1]
    )
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 29: Dependency table by type of registration (reintegration)
Registration Not preregistered Preregistered
Not preregistered 23 (62) -
Preregistered - 22 (140)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
prereg_subgroup_dat_cross_mental <- cat_dat_cross(
  data = mental_health_dat,
  variable = prereg_chr,
  study_id = study
)

prereg_subgroup_dat_cross_mental |>
  knitr::kable(
    "html",
    col.names = c(
      "Risk of bias judgment",
      colnames(prereg_subgroup_dat_cross_mental)[-1]
    ) 
  ) |>
  kableExtra::column_spec(1, bold = TRUE) |>
  kableExtra::footnote(
    general = paste0("Values outside the parentheses are number of studies,", "
                     with the number of samples and effect size estimates shown in the parentheses."
                     ), 
    general_title = "Note: ",
    footnote_as_chunk = T
  )  |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "condensed"), full_width = T)
Table 30: Dependency table by type of registration (mental health)
Risk of bias judgment Not preregistered Preregistered
Not preregistered 21 (59) -
Preregistered - 20 (82)
Note: Values outside the parentheses are number of studies,
with the number of samples and effect size estimates shown in the parentheses.
Show the code
cat_ridge(data = reintegration_dat, es = gt_pop, variable = prereg_chr, v = vgt_pop)
Figure 62: Distribution of effect size estimates, by type of registration (reintegrational outcome).
Show the code
cat_ridge(data = gb_dat, es = gt_pop, variable = prereg_chr, v = vgt_pop) 
Figure 63: Distribution of effect size estimates, by type of registration (mental health).
Show the code
cat_ridge(data = gb_dat, es = gt_pop, variable = overall_rob, v = vgt_pop) + 
  facet_grid(outcome_construct~prereg_chr) + 
  theme(
    strip.background = element_rect(color = "black", fill = "gray92")
  )
Figure 64: Distribution of effect size estimates, by risk of bias assessemnt across outcomes and registration (mental health).

Continuous moderators

Show the code
var_labels <- c(
  "Mean age" = "age",
  "Percent Male" = "male_pct",
  "Total Number of Sessions" = "sessions",
  "Sessions per Week" = "intensity",
  "Length of Intervention (in Weeks)" = "duration",
  "Weeks After End of Intervention" = "timing",
  "Weeks from Baseline" = "weeks_from_baseline"
)

continuous_descriptives <- 
 reintegration_dat |> 
  summarise(
    age = mean(age_mean),
    male_pct = mean(male_pct),
    sessions = mean(total_number_of_sessions),
    intensity = mean(sessions_per_week),
    duration = mean(duration_in_weeks),
    timing = mean(time_after_end_intervention_weeks),
    weeks_from_baseline = mean(time_from_baseline_weeks),
    .by = study
  ) 

continuous_descriptives_tab <- 
  continuous_descriptives |> 
  #pivot_longer(
  #  cols = age:male_pct,
  #  names_to = "var",
  #  values_to = "val"
  #) |> 
  #arrange(var)
  gather(var, val, age, male_pct, sessions, intensity, duration, timing, weeks_from_baseline) |>
  summarise(
    `% Missing` = 100 * mean(is.na(val)),
    Mean = mean(val, na.rm = TRUE),
    SD = sd(val, na.rm = TRUE),
    Min = min(val, na.rm = TRUE),
    LQ = quantile(val, na.rm = TRUE)[2],
    Median = median(val, na.rm = TRUE),
    UQ = quantile(val, na.rm = TRUE)[4],
    Max = max(val, na.rm = TRUE),
    .by = var
  ) |> 
  mutate(
    var = factor(var, levels = var_labels, labels = names(var_labels))
  )

knitr::kable(
  continuous_descriptives_tab, 
  col.names = c("Variable", colnames(continuous_descriptives_tab)[-1]),
  digits = 1,
  booktabs = TRUE
) |>
  kable_styling(bootstrap_options = c("striped", "condensed"), full_width = FALSE) |>
  collapse_rows(1, valign = "top")
Table 31: Distribution of continuous moderators (reintegration)
Variable % Missing Mean SD Min LQ Median UQ Max
Mean age 0.0 40.7 9.1 24.9 35.6 40.8 43.8 67.4
Percent Male 2.2 45.8 23.0 0.0 31.5 45.7 67.4 79.5
Total Number of Sessions 2.2 21.2 22.0 3.0 8.0 12.0 24.0 104.0
Sessions per Week 2.2 1.3 1.5 0.1 1.0 1.0 1.0 10.5
Length of Intervention (in Weeks) 0.0 18.6 17.0 4.0 8.0 12.0 24.0 78.0
Weeks After End of Intervention 0.0 6.0 10.2 0.0 0.0 1.0 6.5 52.0
Weeks from Baseline 0.0 24.6 22.8 6.0 12.0 18.0 26.0 130.0
Show the code
var_labels_mental <- c(
  "Mean age" = "age",
  "Percent Male" = "male_pct",
  "N Sessions" = "sessions",
  "Sessions Week" = "intensity",
  "Length" = "duration",
  "Weeks After Intervention" = "timing",
  "Weeks Baseline" = "weeks_from_baseline"
)

continuous_descriptives_mental <- 
 mental_health_dat |> 
  summarise(
    age = mean(age_mean),
    male_pct = mean(male_pct),
    sessions = mean(total_number_of_sessions),
    intensity = mean(sessions_per_week),
    duration = mean(duration_in_weeks),
    timing = mean(time_after_end_intervention_weeks),
    weeks_from_baseline = mean(time_from_baseline_weeks),
    .by = study
  ) 

continuous_descriptives_tab_mental <- 
  continuous_descriptives_mental |> 
  #pivot_longer(
  #  cols = age:male_pct,
  #  names_to = "var",
  #  values_to = "val"
  #) |> 
  #arrange(var)
  gather(var, val, age, male_pct, sessions, intensity, duration, timing, weeks_from_baseline) |>
  summarise(
    `% Missing` = 100 * mean(is.na(val)),
    Mean = mean(val, na.rm = TRUE),
    SD = sd(val, na.rm = TRUE),
    Min = min(val, na.rm = TRUE),
    LQ = quantile(val, na.rm = TRUE)[2],
    Median = median(val, na.rm = TRUE),
    UQ = quantile(val, na.rm = TRUE)[4],
    Max = max(val, na.rm = TRUE),
    .by = var
  ) |> 
  mutate(
    var = factor(var, levels = var_labels_mental, labels = names(var_labels_mental))
  )

knitr::kable(
  continuous_descriptives_tab_mental, 
  col.names = c("Variable", colnames(continuous_descriptives_tab)[-1]),
  digits = 1,
  booktabs = TRUE
) |>
  kable_styling(bootstrap_options = c("striped", "condensed"), full_width = FALSE) |>
  collapse_rows(1, valign = "top")
Table 32: Distribution of continuous moderators (mental health)
Variable % Missing Mean SD Min LQ Median UQ Max
Mean age 0.0 39.6 9.4 21.6 34.8 39.8 43.1 67.4
Percent Male 2.4 44.3 23.1 0.0 28.7 45.7 64.1 77.8
N Sessions 2.4 22.0 22.7 3.0 9.5 13.0 24.0 104.0
Sessions Week 2.4 1.3 1.6 0.1 1.0 1.0 1.0 10.5
Length 0.0 19.6 17.6 4.0 10.0 12.0 26.0 78.0
Weeks After Intervention 0.0 7.0 11.1 0.0 0.0 1.0 8.0 52.0
Weeks Baseline 0.0 26.6 24.3 6.0 12.0 18.0 29.0 130.0

Age distribution across studies

Show the code
density_plot <- function(variable, x_title, data, color = "cornflowerblue") {
  require(dplyr)
  require(tidyr)
  require(ggplot2)
  require(rlang)
  require(MetBrewer)
  
  var_exp <- enquo(variable)
  var_str <- as_label(var_exp)
  
  data |>
    ggplot(aes(x = !!var_exp)) +
    geom_density(fill = color, alpha = 0.8) +
    geom_rug(alpha = 0.7, length = unit(0.04, "npc")) +
    scale_y_continuous(labels = scales::label_number(accuracy = 10^(-3))) +
    theme_minimal() +
    labs(x = x_title, y = "")
}
Show the code
age_density <- density_plot(age, "Mean Age", continuous_descriptives)

age_density + expand_limits(x = 70)
Figure 65: Distribution of average age in a study (reintegrational).
Show the code
age_density_mental <- density_plot(age, "Mean Age", continuous_descriptives_mental, color = "gray")

age_density_mental + expand_limits(x = 70)
Figure 66: Distribution of average age in a study (mental health).

Percent males in sample distribution across studies

Show the code
male_density <- suppressWarnings(density_plot(male_pct, "Proportion Male", continuous_descriptives))
male_density 
Figure 67: Distribution proportion of males in each study (reintegration).
Show the code
male_density_mental <- suppressWarnings(density_plot(male_pct, "Proportion Male", continuous_descriptives_mental, color = "gray"))
male_density_mental 
Figure 68: Distribution proportion of males in each study (mental health).

Total number of sessions

Show the code
hist_plot <- function(variable, x_title, data, color = "cornflowerblue") {
  require(dplyr)
  require(tidyr)
  require(ggplot2)
  require(rlang)
  require(MetBrewer)
  
  var_exp <- enquo(variable)
  var_str <- as_label(var_exp)
  
  x_vals <- data[[var_str]]
  min_val <- floor(min(x_vals, na.rm = TRUE))
  max_val <- ceiling(max(x_vals, na.rm = TRUE))
  
  data |>
    ggplot(aes(x = !!var_exp)) +
    geom_histogram(binwidth = 1, boundary = 0, fill = color, alpha = 0.8) +
    scale_x_continuous(breaks = pretty(seq(min_val, max_val, by = 1), n = 5)) +
    scale_y_continuous(breaks = seq(0, 10, 2)) +
    theme_minimal() +
    labs(x = x_title, y = "")
}
Show the code
sessions_hist <- hist_plot(sessions, "Total Number of Sessions in Intervention", continuous_descriptives)
sessions_hist + labs(title = "Reintegration") + theme(plot.title = element_text(hjust = 0.5))
Figure 69: Distribution of study sessions (reintegration).
Show the code
sessions_hist_mental <- hist_plot(sessions, "Total Number of Sessions in Intervention", continuous_descriptives_mental, color = "gray")
sessions_hist_mental + labs(title = "Mental Health") + theme(plot.title = element_text(hjust = 0.5))
Figure 70: Distribution of study sessions (mental health).

Duration and intensity (number of sessions per week)

Show the code
reintegration_dat |>
  select(study, duration_in_weeks, sessions_per_week, N_total) |> 
  filter(!is.na(sessions_per_week)) |>  
  arrange(desc(duration_in_weeks)) |> 
  mutate(
    study = factor(study, levels = unique(study)),
    sessions = case_when(
      sessions_per_week < 1 ~ "1<",
      sessions_per_week == 1 ~ "1",
      sessions_per_week == 1.5 ~ "1.5",
      sessions_per_week == 2 ~ "2",
      sessions_per_week == 2.5 ~ "2.5",
      sessions_per_week > 2 ~ ">10"
    ),
    sessions = factor(sessions, levels = unique(sessions))
  ) |> 
  ggplot(aes(y = study, x = duration_in_weeks, color = study)) +
  geom_segment(aes(x = 0, xend = duration_in_weeks, y = study, yend = study)) +
  geom_vline(xintercept = c(13, 26, 52, 78), linetype = "dashed", alpha = 0.5) +
  geom_point(
    aes(size = N_total)
  ) +
  scale_x_continuous(breaks = seq(0, 80, 10)) +
  facet_grid(vars(sessions_per_week), scales = "free_y", space = "free_y", switch = "y") + 
  #scale_size(breaks = c(0.5, 1, 1.5, 2, 10.5), limits = c(0, 10.5)) +
  labs(
    x = "Lenght of intervention in weeks", 
    y = "", 
    caption = paste0(
      "The light gray facet grids indicate the average number of sessions per week.\n", 
      "The dashed lines indicate 3 months, 6 months, 1 year, and 1.5 years, respectively.\n",
      "The point sizes are weighted by the study sample sizes."
      )
  ) +
  theme_minimal() + 
  scale_colour_discrete(guide = "none") +
  theme(
    legend.position = "none", 
    strip.text = element_text(color = "black"),
    strip.background.y = element_rect(fill = "gray93", color = "white"),
    strip.text.y.left = element_text(angle = 0),
    plot.caption = element_text(hjust = 0)
  ) 
Figure 71: Length of intervention in weeks (reintegration)
Show the code
mental_health_dat |>
  select(study, duration_in_weeks, sessions_per_week, N_total) |> 
  filter(!is.na(sessions_per_week)) |>  
  arrange(desc(duration_in_weeks)) |> 
  mutate(
    study = factor(study, levels = unique(study)),
    sessions = case_when(
      sessions_per_week < 1 ~ "Less than 1",
      sessions_per_week == 1 ~ "1 per week",
      sessions_per_week == 2 ~ "2 per week",
      sessions_per_week > 2 ~ ">10"
    ),
    sessions = factor(sessions, levels = unique(sessions))
  ) |> 
  ggplot(aes(y = study, x = duration_in_weeks, color = study)) +
  geom_segment(aes(x = 0, xend = duration_in_weeks, y = study, yend = study)) +
  geom_vline(xintercept = c(13, 26, 52, 78), linetype = "dashed", alpha = 0.5) +
  geom_point(
    aes(size = N_total)
  ) +
  scale_x_continuous(breaks = seq(0, 80, 10)) +
  facet_grid(vars(sessions_per_week), scales = "free_y", space = "free_y", switch = "y") + 
  #scale_size(breaks = c(0.5, 1, 1.5, 2, 10.5), limits = c(0, 10.5)) +
  labs(
    x = "Lenght of intervention in weeks", 
    y = "", 
    caption = 
      paste0(
      "The light gray facet grids indicate the average number of sessions per week.\n", 
      "The dashed lines indicate 3 months, 6 months, 1 year, and 1.5 years, respectively.\n",
      "The point sizes are weighted by the study sample sizes."
      )
  ) +
  theme_minimal() + 
  scale_colour_discrete(guide = "none") +
  theme(
    legend.position = "none", 
    strip.text = element_text(color = "black"),
    strip.background.y = element_rect(fill = "gray93", color = "white"),
    strip.text.y.left = element_text(angle = 0),
    plot.caption = element_text(hjust = 0)
  )  
Figure 72: Length of intervention in weeks (mental health)

Weeks after end of intervention

Show the code
reintegration_dat |>
  select(study, time_after_end_intervention_weeks, N_total) |> 
  arrange(desc(study)) |> 
  mutate(study = factor(study, levels = unique(study))) |> 
  ggplot(aes(y = study, x = time_after_end_intervention_weeks, color = study)) +
  geom_point(aes(size = N_total),
             alpha = 0.5) +
  geom_line() +
  labs(x = "Weeks after end of intervention all studies", y = "")+
  theme_minimal() + 
  theme(legend.position = "none")
Figure 73: Weeks after end of interventions for all studies (reintegration)
Show the code
mental_health_dat |>
  select(study, time_after_end_intervention_weeks, N_total) |> 
  arrange(desc(study)) |> 
  mutate(study = factor(study, levels = unique(study))) |> 
  ggplot(aes(y = study, x = time_after_end_intervention_weeks, color = study)) +
  geom_point(aes(size = N_total),
             alpha = 0.5) +
  geom_line() +
  labs(x = "Weeks after end of intervention all studies", y = "")+
  theme_minimal() + 
  theme(legend.position = "none")
Figure 74: Weeks after end of interventions for all studies (mental health)

Correlation between effect size estimates and measurement timing

Show the code
reintegration_dat |> 
  select(study, gt_pop, vgt_pop, time_after_end_intervention_weeks) |> 
  ggplot() +
  aes(x = time_after_end_intervention_weeks, y = gt_pop, color = study) +
  geom_vline(xintercept = 0) + 
  geom_hline(yintercept = 0) + 
  geom_point(aes(size = 1/vgt_pop), alpha = 0.30) + 
  geom_smooth(method = "lm", formula = y ~ x, color = "yellow") + 
  scale_x_continuous(breaks = seq(0, 55, 5)) +
  theme_minimal() + 
  theme(legend.position = "none") + 
  labs(x = "Follow-up duration (months)", y = "Hedges' g")
Figure 75: Length of intervention in weeks (reintegration)
Show the code
mental_health_dat |> 
  select(study, gt_pop, vgt_pop, time_after_end_intervention_weeks) |> 
  ggplot() +
  aes(x = time_after_end_intervention_weeks, y = gt_pop, color = study) +
  geom_vline(xintercept = 0) + 
  geom_hline(yintercept = 0) + 
 geom_point(aes(size = 1/vgt_pop), alpha = 0.30) + 
  geom_smooth(method = "lm", formula = y ~ x, color = "yellow") + 
  scale_x_continuous(breaks = seq(0, 55, 5)) +
  theme_minimal() + 
  theme(legend.position = "none") + 
  labs(x = "Follow-up duration (months)", y = "Hedges' g")
Figure 76: Length of intervention in weeks (mental health)

Multivariate structure

Covariance plots

Show the code
multivariate_dat_reint <- 
  reintegration_dat |>
  filter(str_detect(analysis_plan, "Alco|Hope|Social|Well")) |> 
  select(
    `Outcome` = analysis_plan,
    `Sample diagnosis` = schizophrenia,
    `Intervention` = CBT_int,
    `Type of test` = test_type,
    `Mean age` = age_mean,
    `% male` = male_pct,
    `Duration` = duration_in_weeks,
    `Intensity` = sessions_per_week,
    `Follow-up` = time_after_end_intervention_weeks
  )

multivariate_pairs_reint <- ggpairs(multivariate_dat_reint) + theme(
    text = element_text(size = 18),
    axis.text.x = element_text(size = 10, angle = 45, vjust = 1, hjust=1),  
    axis.text.y = element_text(size = 10) 
  ) 

multivariate_pairs_reint
Figure 77: Multivariate structure between substaintial/theoretical categorical and continuous (reintegration)
Show the code
multivariate_dat_mental <- 
  mental_health_dat |> 
  select(
    `Outcome` = analysis_plan,
    `Sample diagnosis` = schizophrenia,
    `Intervention` = CBT_int,
    `Type of test` = test_type,
    `Mean age` = age_mean,
    `% male` = male_pct,
    `Duration` = duration_in_weeks,
    `Intensity` = sessions_per_week,
    `Follow-up` = time_after_end_intervention_weeks
  )

multivariate_pairs_mental <- ggpairs(multivariate_dat_mental) + theme(
    text = element_text(size = 18),
    axis.text.x = element_text(size = 10, angle = 45, vjust = 1, hjust=1),  
    axis.text.y = element_text(size = 10) 
  )

multivariate_pairs_mental
Figure 78: Multivariate structure between substaintial/theoretical categorical and continuous covariates (mental health)
Show the code
multivariate_dat_reint_method <- 
  reintegration_dat |>
  filter(str_detect(analysis_plan, "Alco|Hope|Social|Well")) |> 
  select(
    `Strategy` = analysis_strategy,
    `Design` = QES_design,
    `Control grp` = control,
    `RoB` = overall_rob,
    `Preregistration` = prereg_chr,
    `Mean age` = age_mean,
    `% male` = male_pct,
    `Duration` = duration_in_weeks,
    `Intensity` = sessions_per_week,
    `Follow-up` = time_after_end_intervention_weeks
  )

multivariate_pairs_reint_method <- ggpairs(multivariate_dat_reint_method) + theme(
    text = element_text(size = 18),
    axis.text.x = element_text(size = 9, angle = 45, vjust = 1, hjust=1),  
    axis.text.y = element_text(size = 9) 
  ) 

multivariate_pairs_reint_method
Figure 79: Multivariate structure between methodological categorical and continuous covariates (reintegration)
Show the code
multivariate_dat_mental_method <- 
  mental_health_dat |> 
  select(
    `Strategy` = analysis_strategy,
    `Design` = QES_design,
    `Control grp` = control,
    `RoB` = overall_rob,
    `Preregistration` = prereg_chr,
    `Mean age` = age_mean,
    `% male` = male_pct,
    `Duration` = duration_in_weeks,
    `Intensity` = sessions_per_week,
    `Follow-up` = time_after_end_intervention_weeks
  )

multivariate_pairs_mental_method <- ggpairs(multivariate_dat_mental_method) + theme(
    text = element_text(size = 18),
    axis.text.x = element_text(size = 9, angle = 45, vjust = 1, hjust=1),  
    axis.text.y = element_text(size = 9) 
  )

multivariate_pairs_mental_method 
Figure 80: Multivariate structure between methodological categorical and continuous (mental health)
Show the code
multivariate_dat_reint_method_theo <- 
  reintegration_dat |>
  filter(str_detect(analysis_plan, "Alco|Hope|Social|Well")) |> 
  select(
    `Outcome` = analysis_plan,
    `Sample diagnosis` = schizophrenia,
    `Intervention` = CBT_int,
    `Type of test` = test_type,
    `Strategy` = analysis_strategy,
    `Design` = QES_design,
    `Control grp` = control,
    `RoB` = overall_rob,
    `Preregistration` = prereg_chr
  )

multivariate_pairs_reint_method_theo <- ggpairs(multivariate_dat_reint_method_theo) + theme(
    text = element_text(size = 18),
    axis.text.x = element_text(size = 9, angle = 45, vjust = 1, hjust=1),  
    axis.text.y = element_text(size = 9) 
  ) 

multivariate_pairs_reint_method_theo
Figure 81: Multivariate structure between substantial and methodological categorical covariates (reintegration)
Show the code
multivariate_dat_mental_method_theo <- 
  mental_health_dat |> 
  select(
    `Outcome` = analysis_plan,
    `Sample diagnosis` = schizophrenia,
    `Intervention` = CBT_int,
    `Type of test` = test_type,
    `Strategy` = analysis_strategy,
    `Design` = QES_design,
    `Control grp` = control,
    `RoB` = overall_rob,
    `Preregistration` = prereg_chr,
    `Mean age` = age_mean,
    `% male` = male_pct,
    `Duration` = duration_in_weeks,
    `Intensity` = sessions_per_week,
    `Follow-up` = time_after_end_intervention_weeks
  )

multivariate_pairs_mental_method_theo <- ggpairs(multivariate_dat_mental_method_theo) + theme(
    text = element_text(size = 18),
    axis.text.x = element_text(size = 9, angle = 45, vjust = 1, hjust=1),  
    axis.text.y = element_text(size = 9) 
  )

multivariate_pairs_mental_method_theo
Figure 82: Multivariate structure between substantial and methodological categorical covariates (mental health)

Covariance matrices

Show the code
cor_mat_dat_cat <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Alco|Hope|Social|Well") & test_type != "Raw events") |> 
  select(
    plan = analysis_plan,
    samp = schizophrenia,
    treat = CBT_int,
    test = test_type,
    str = analysis_strategy,
    des = QES_design,
    ctr = control,
    rob = overall_rob,
    pre = prereg_chr
  )

cat_dummy_dat <- 
  fastDummies::dummy_cols(cor_mat_dat_cat) %>% 
  select(where(is.numeric))


cor_mat_dat_con <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Alco|Hope|Social|Well") & test_type != "Raw events") |> 
  select(
    age = age_mean,
    male = male_pct,
    dur = duration_in_weeks,
    int = sessions_per_week,
    FU = time_after_end_intervention_weeks,
    sess = total_number_of_sessions
  )

cor_mat_dat <- 
  bind_cols(cat_dummy_dat, cor_mat_dat_con) |> 
  select(
    alcho = `plan_Alcohol and drug abuse/misuse`,
    hope = `plan_Hope, empowerment & self-efficacy`,
    sfunc = `plan_Social functioning (degree of impairment)`,
    wellb = `plan_Wellbeing and quality of life`,
    s_schizo = samp_Schizophrenia,
    s_oth = samp_Other,
    cbt_trt = treat_CBT, 
    oth_trt = treat_Other,
    test_clin = `test_Clinician-rated measure`,
    test_self = `test_Self-reported`,
    itt = str_ITT,
    tot = str_TOT,
    qes = des_QES,
    rct = des_RCT,
    tau = ctr_TAU,
    tau_wait = `ctr_TAU with Waiting-list`,
    wait = `ctr_Waiting-list only`,
    ind_trt = `ctr_Individual treatment` ,
    rob_low = rob_Low,
    rob_mod = `rob_Some concerns/Moderate`,
    rob_high = `rob_Serious/High`,
    prereg = pre_Preregistered, 
    conventional = `pre_Not preregistered`,
    everything()
  ) |> 
  na.omit()

cor_mat <- 
  cor(
  model.matrix(
    reformulate(names(cor_mat_dat[,1:ncol(cor_mat_dat)])), 
    data = cor_mat_dat
    )
  ) |>  
  as.data.frame() |> 
  select(-c(`(Intercept)`)) |>  
  na.omit() |> 
  mutate(
    
    across(.cols = everything(), ~ round(.x, 2))
  )

cor_mat_formatted <- 
  cor_mat |> 
  mutate(
    across(.cols = everything(), ~ cell_spec(.x, bold = ifelse(abs(.x) > 0.5, T, F)))
  )

kbl(
  cor_mat_formatted, 
  escape = F,
  col.names = c("Category", colnames(cor_mat))
  ) |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "100%", fixed_thead = TRUE)
Table 33: Correlation matrix across all reintegration outcomes.
Category alcho hope sfunc wellb s_schizo s_oth cbt_trt oth_trt test_clin test_self itt tot qes rct tau tau_wait wait ind_trt rob_low rob_mod rob_high prereg conventional age male dur int FU sess
alcho 1 -0.22 -0.27 -0.36 -0.19 0.19 -0.23 0.23 0.49 -0.49 0.33 -0.33 0.03 -0.03 0.04 0.03 -0.1 -0.06 -0.36 0.39 -0.05 0.02 -0.02 -0.26 -0.37 0.01 0.06 -0.05 0.14
hope -0.22 1 -0.28 -0.38 0.02 -0.02 -0.31 0.31 -0.23 0.23 -0.16 0.16 -0.05 0.05 -0.16 -0.02 0.32 0.05 -0.22 0.17 0.06 -0.17 0.17 0.12 0.17 -0.14 -0.04 -0.13 -0.11
sfunc -0.27 -0.28 1 -0.46 0.19 -0.19 0.23 -0.23 -0.04 0.04 -0.01 0.01 -0.08 0.08 0.06 0 -0.13 0.02 0.3 -0.26 -0.04 0.06 -0.06 -0.17 0.02 0.3 -0.06 0.19 0.17
wellb -0.36 -0.38 -0.46 1 -0.04 0.04 0.22 -0.22 -0.16 0.16 -0.13 0.13 0.08 -0.08 0.04 -0.01 -0.06 -0.01 0.19 -0.2 0.03 0.07 -0.07 0.27 0.13 -0.16 0.04 -0.02 -0.17
s_schizo -0.19 0.02 0.19 -0.04 1 -1 -0.26 0.26 -0.07 0.07 0.2 -0.2 -0.02 0.02 0.12 -0.16 -0.09 0.2 0.38 -0.36 -0.02 0.08 -0.08 -0.21 0.5 0.49 -0.01 0.06 0.38
s_oth 0.19 -0.02 -0.19 0.04 -1 1 0.26 -0.26 0.07 -0.07 -0.2 0.2 0.02 -0.02 -0.12 0.16 0.09 -0.2 -0.38 0.36 0.02 -0.08 0.08 0.21 -0.5 -0.49 0.01 -0.06 -0.38
cbt_trt -0.23 -0.31 0.23 0.22 -0.26 0.26 1 -1 -0.11 0.11 -0.25 0.25 -0.03 0.03 0.13 -0.15 -0.02 0.01 0.31 -0.2 -0.15 0.1 -0.1 0.04 -0.32 -0.26 -0.04 0.2 -0.27
oth_trt 0.23 0.31 -0.23 -0.22 0.26 -0.26 -1 1 0.11 -0.11 0.25 -0.25 0.03 -0.03 -0.13 0.15 0.02 -0.01 -0.31 0.2 0.15 -0.1 0.1 -0.04 0.32 0.26 0.04 -0.2 0.27
test_clin 0.49 -0.23 -0.04 -0.16 -0.07 0.07 -0.11 0.11 1 -1 0.23 -0.23 0.09 -0.09 0.17 -0.11 -0.11 -0.06 -0.28 0.26 0.02 -0.03 0.03 -0.19 -0.37 -0.03 0.06 -0.02 0.03
test_self -0.49 0.23 0.04 0.16 0.07 -0.07 0.11 -0.11 -1 1 -0.23 0.23 -0.09 0.09 -0.17 0.11 0.11 0.06 0.28 -0.26 -0.02 0.03 -0.03 0.19 0.37 0.03 -0.06 0.02 -0.03
itt 0.33 -0.16 -0.01 -0.13 0.2 -0.2 -0.25 0.25 0.23 -0.23 1 -1 -0.1 0.1 0.26 -0.1 -0.24 -0.15 -0.19 0.25 -0.1 0.17 -0.17 -0.15 -0.02 0.27 -0.02 -0.07 0.21
tot -0.33 0.16 0.01 0.13 -0.2 0.2 0.25 -0.25 -0.23 0.23 -1 1 0.1 -0.1 -0.26 0.1 0.24 0.15 0.19 -0.25 0.1 -0.17 0.17 0.15 0.02 -0.27 0.02 0.07 -0.21
qes 0.03 -0.05 -0.08 0.08 -0.02 0.02 -0.03 0.03 0.09 -0.09 -0.1 0.1 1 -1 -0.01 -0.1 0.07 0.17 -0.18 -0.18 0.51 -0.41 0.41 -0.12 -0.06 0.22 0.41 -0.07 0.47
rct -0.03 0.05 0.08 -0.08 0.02 -0.02 0.03 -0.03 -0.09 0.09 0.1 -0.1 -1 1 0.01 0.1 -0.07 -0.17 0.18 0.18 -0.51 0.41 -0.41 0.12 0.06 -0.22 -0.41 0.07 -0.47
tau 0.04 -0.16 0.06 0.04 0.12 -0.12 0.13 -0.13 0.17 -0.17 0.26 -0.26 -0.01 0.01 1 -0.8 -0.44 -0.26 0.1 0.11 -0.29 0.04 -0.04 0.02 -0.07 0.06 -0.3 0.28 -0.11
tau_wait 0.03 -0.02 0 -0.01 -0.16 0.16 -0.15 0.15 -0.11 0.11 -0.1 0.1 -0.1 0.1 -0.8 1 -0.09 -0.05 0 -0.26 0.37 0.2 -0.2 -0.11 0.03 -0.07 0.17 -0.24 0.07
wait -0.1 0.32 -0.13 -0.06 -0.09 0.09 -0.02 0.02 -0.11 0.11 -0.24 0.24 0.07 -0.07 -0.44 -0.09 1 -0.03 -0.17 0.23 -0.09 -0.32 0.32 0.24 0 -0.08 0.3 -0.09 0.02
ind_trt -0.06 0.05 0.02 -0.01 0.2 -0.2 0.01 -0.01 -0.06 0.06 -0.15 0.15 0.17 -0.17 -0.26 -0.05 -0.03 1 -0.01 -0.04 0.07 -0.13 0.13 -0.14 0.14 0.14 0 -0.08 0.11
rob_low -0.36 -0.22 0.3 0.19 0.38 -0.38 0.31 -0.31 -0.28 0.28 -0.19 0.19 -0.18 0.18 0.1 0 -0.17 -0.01 1 -0.75 -0.32 0.45 -0.45 -0.01 0.12 0.36 -0.31 0.28 0.01
rob_mod 0.39 0.17 -0.26 -0.2 -0.36 0.36 -0.2 0.2 0.26 -0.26 0.25 -0.25 -0.18 0.18 0.11 -0.26 0.23 -0.04 -0.75 1 -0.39 -0.3 0.3 0.19 -0.04 -0.38 0.15 -0.19 -0.19
rob_high -0.05 0.06 -0.04 0.03 -0.02 0.02 -0.15 0.15 0.02 -0.02 -0.1 0.1 0.51 -0.51 -0.29 0.37 -0.09 0.07 -0.32 -0.39 1 -0.19 0.19 -0.25 -0.11 0.05 0.21 -0.13 0.26
prereg 0.02 -0.17 0.06 0.07 0.08 -0.08 0.1 -0.1 -0.03 0.03 0.17 -0.17 -0.41 0.41 0.04 0.2 -0.32 -0.13 0.45 -0.3 -0.19 1 -1 0.34 -0.21 0.03 -0.27 0.13 -0.19
conventional -0.02 0.17 -0.06 -0.07 -0.08 0.08 -0.1 0.1 0.03 -0.03 -0.17 0.17 0.41 -0.41 -0.04 -0.2 0.32 0.13 -0.45 0.3 0.19 -1 1 -0.34 0.21 -0.03 0.27 -0.13 0.19
age -0.26 0.12 -0.17 0.27 -0.21 0.21 0.04 -0.04 -0.19 0.19 -0.15 0.15 -0.12 0.12 0.02 -0.11 0.24 -0.14 -0.01 0.19 -0.25 0.34 -0.34 1 -0.01 -0.29 0 -0.01 -0.24
male -0.37 0.17 0.02 0.13 0.5 -0.5 -0.32 0.32 -0.37 0.37 -0.02 0.02 -0.06 0.06 -0.07 0.03 0 0.14 0.12 -0.04 -0.11 -0.21 0.21 -0.01 1 0.24 -0.01 -0.09 0.1
dur 0.01 -0.14 0.3 -0.16 0.49 -0.49 -0.26 0.26 -0.03 0.03 0.27 -0.27 0.22 -0.22 0.06 -0.07 -0.08 0.14 0.36 -0.38 0.05 0.03 -0.03 -0.29 0.24 1 -0.05 0.21 0.77
int 0.06 -0.04 -0.06 0.04 -0.01 0.01 -0.04 0.04 0.06 -0.06 -0.02 0.02 0.41 -0.41 -0.3 0.17 0.3 0 -0.31 0.15 0.21 -0.27 0.27 0 -0.01 -0.05 1 -0.19 0.41
FU -0.05 -0.13 0.19 -0.02 0.06 -0.06 0.2 -0.2 -0.02 0.02 -0.07 0.07 -0.07 0.07 0.28 -0.24 -0.09 -0.08 0.28 -0.19 -0.13 0.13 -0.13 -0.01 -0.09 0.21 -0.19 1 0
sess 0.14 -0.11 0.17 -0.17 0.38 -0.38 -0.27 0.27 0.03 -0.03 0.21 -0.21 0.47 -0.47 -0.11 0.07 0.02 0.11 0.01 -0.19 0.26 -0.19 0.19 -0.24 0.1 0.77 0.41 0 1

Excluded factors due to no variation: type of sample (schizophania vs. rest), low risk of bias.

Show the code
cor_mat_dat_cat_alcohol <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Alco") & test_type != "Raw events") |> 
  select(
    treat = CBT_int,
    test = test_type,
    str = analysis_strategy,
    des = QES_design,
    ctr = control,
    rob = overall_rob,
    pre = prereg_chr
  )

cat_dummy_dat_alcohol <- 
  fastDummies::dummy_cols(cor_mat_dat_cat_alcohol) %>% 
  select(where(is.numeric))


cor_mat_dat_con_alcohol <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Alco") & test_type != "Raw events") |> 
  select(
    age = age_mean,
    male = male_pct,
    dur = duration_in_weeks,
    int = sessions_per_week,
    FU = time_after_end_intervention_weeks,
    sess = total_number_of_sessions
  )

cor_mat_dat_alcohol <- 
  bind_cols(cat_dummy_dat_alcohol, cor_mat_dat_con_alcohol) |> 
  select(
    cbt_trt = treat_CBT, 
    oth_trt = treat_Other,
    test_clin = `test_Clinician-rated measure`,
    test_self = `test_Self-reported`,
    itt = str_ITT,
    tot = str_TOT,
    qes = des_QES,
    rct = des_RCT,
    tau = ctr_TAU,
    tau_wait = `ctr_TAU with Waiting-list`,
    rob_mod = `rob_Some concerns/Moderate`,
    rob_high = `rob_Serious/High`,
    prereg = pre_Preregistered, 
    conventional = `pre_Not preregistered`,
    age:sess
  ) |> 
  na.omit()

cor_mat_alcohol <- 
  cor(
    model.matrix(
      reformulate(names(cor_mat_dat_alcohol[,1:ncol(cor_mat_dat_alcohol)])), 
      data = cor_mat_dat_alcohol
    )
  ) |> 
  as.data.frame() |> 
  select(-c(`(Intercept)`)) |>   
  na.omit() |> 
  mutate(
    
    across(.cols = everything(), ~ round(.x, 2))
  )

cor_mat_formatted_alcohol <- 
  cor_mat_alcohol |> 
  mutate(
    across(.cols = everything(), ~ cell_spec(.x, bold = ifelse(abs(.x) > 0.5, T, F)))
  )


kbl(
  cor_mat_formatted_alcohol, 
  escape = F,
  col.names = c("Category", colnames(cor_mat_alcohol))
  ) |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "100%", fixed_thead = TRUE)
Table 34: Correlation matrix based on alcohol outcome only.
Category cbt_trt oth_trt test_clin test_self itt tot qes rct tau tau_wait rob_mod rob_high prereg conventional age male dur int FU sess
cbt_trt 1 -1 -0.33 0.33 0.09 -0.09 -0.07 0.07 0.12 -0.12 0.09 -0.09 -0.48 0.48 -0.5 0.16 -0.17 -0.12 0.27 -0.13
oth_trt -1 1 0.33 -0.33 -0.09 0.09 0.07 -0.07 -0.12 0.12 -0.09 0.09 0.48 -0.48 0.5 -0.16 0.17 0.12 -0.27 0.13
test_clin -0.33 0.33 1 -1 0.41 -0.41 -0.33 0.33 0.55 -0.55 0.41 -0.41 0.68 -0.68 0.63 -0.79 -0.28 -0.57 0.32 -0.4
test_self 0.33 -0.33 -1 1 -0.41 0.41 0.33 -0.33 -0.55 0.55 -0.41 0.41 -0.68 0.68 -0.63 0.79 0.28 0.57 -0.32 0.4
itt 0.09 -0.09 0.41 -0.41 1 -1 0.09 -0.09 -0.15 0.15 -0.11 0.11 0.6 -0.6 0.64 -0.59 0.41 0.15 0.1 0.25
tot -0.09 0.09 -0.41 0.41 -1 1 -0.09 0.09 0.15 -0.15 0.11 -0.11 -0.6 0.6 -0.64 0.59 -0.41 -0.15 -0.1 -0.25
qes -0.07 0.07 -0.33 0.33 0.09 -0.09 1 -1 0.12 -0.12 -0.8 0.8 -0.48 0.48 -0.24 -0.17 0.89 0.81 -0.23 0.94
rct 0.07 -0.07 0.33 -0.33 -0.09 0.09 -1 1 -0.12 0.12 0.8 -0.8 0.48 -0.48 0.24 0.17 -0.89 -0.81 0.23 -0.94
tau 0.12 -0.12 0.55 -0.55 -0.15 0.15 0.12 -0.12 1 -1 0.15 -0.15 -0.25 0.25 -0.18 -0.56 -0.22 -0.42 0.38 -0.18
tau_wait -0.12 0.12 -0.55 0.55 0.15 -0.15 -0.12 0.12 -1 1 -0.15 0.15 0.25 -0.25 0.18 0.56 0.22 0.42 -0.38 0.18
rob_mod 0.09 -0.09 0.41 -0.41 -0.11 0.11 -0.8 0.8 0.15 -0.15 1 -1 0.34 -0.34 0.37 0.19 -0.76 -0.62 0.28 -0.76
rob_high -0.09 0.09 -0.41 0.41 0.11 -0.11 0.8 -0.8 -0.15 0.15 -1 1 -0.34 0.34 -0.37 -0.19 0.76 0.62 -0.28 0.76
prereg -0.48 0.48 0.68 -0.68 0.6 -0.6 -0.48 0.48 -0.25 0.25 0.34 -0.34 1 -1 0.89 -0.42 -0.14 -0.29 0.04 -0.3
conventional 0.48 -0.48 -0.68 0.68 -0.6 0.6 0.48 -0.48 0.25 -0.25 -0.34 0.34 -1 1 -0.89 0.42 0.14 0.29 -0.04 0.3
age -0.5 0.5 0.63 -0.63 0.64 -0.64 -0.24 0.24 -0.18 0.18 0.37 -0.37 0.89 -0.89 1 -0.35 0.1 0 0 -0.03
male 0.16 -0.16 -0.79 0.79 -0.59 0.59 -0.17 0.17 -0.56 0.56 0.19 -0.19 -0.42 0.42 -0.35 1 -0.17 0.24 -0.25 -0.06
dur -0.17 0.17 -0.28 0.28 0.41 -0.41 0.89 -0.89 -0.22 0.22 -0.76 0.76 -0.14 0.14 0.1 -0.17 1 0.91 -0.3 0.98
int -0.12 0.12 -0.57 0.57 0.15 -0.15 0.81 -0.81 -0.42 0.42 -0.62 0.62 -0.29 0.29 0 0.24 0.91 1 -0.39 0.94
FU 0.27 -0.27 0.32 -0.32 0.1 -0.1 -0.23 0.23 0.38 -0.38 0.28 -0.28 0.04 -0.04 0 -0.25 -0.3 -0.39 1 -0.32
sess -0.13 0.13 -0.4 0.4 0.25 -0.25 0.94 -0.94 -0.18 0.18 -0.76 0.76 -0.3 0.3 -0.03 -0.06 0.98 0.94 -0.32 1

Excluded factors due to no variation: type of intervention (CBT vs. rest) and type of test.

Show the code
cor_mat_dat_cat_hope <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Hope") & test_type != "Raw events") |> 
  select(
    samp = schizophrenia,
    treat = CBT_int,
    test = test_type,
    str = analysis_strategy,
    des = QES_design,
    ctr = control,
    rob = overall_rob,
    pre = prereg_chr
  )

cat_dummy_dat_hope <- 
  fastDummies::dummy_cols(cor_mat_dat_cat_hope) %>% 
  select(where(is.numeric))


cor_mat_dat_con_hope <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Hope") & test_type != "Raw events") |> 
  select(
    age = age_mean,
    male = male_pct,
    dur = duration_in_weeks,
    int = sessions_per_week,
    FU = time_after_end_intervention_weeks,
    sess = total_number_of_sessions
  )

cor_mat_dat_hope <- 
  bind_cols(cat_dummy_dat_hope, cor_mat_dat_con_hope) |> 
  select(
    s_schizo = samp_Schizophrenia,
    s_oth = samp_Other,
    itt = str_ITT,
    tot = str_TOT,
    qes = des_QES,
    rct = des_RCT,
    tau = ctr_TAU,
    tau_wait = `ctr_TAU with Waiting-list`,
    wait = `ctr_Waiting-list only`,
    ind_trt = `ctr_Individual treatment` ,
    rob_low = rob_Low,
    rob_mod = `rob_Some concerns/Moderate`,
    rob_high = `rob_Serious/High`,
    prereg = pre_Preregistered, 
    conventional = `pre_Not preregistered`,
    age:sess
  ) |> 
  na.omit()

cor_mat_hope <- 
  cor(
    model.matrix(
      reformulate(names(cor_mat_dat_hope[,1:ncol(cor_mat_dat_hope)])), 
      data = cor_mat_dat_hope
    )
  ) |>  
  as.data.frame() |>  
  select(-c(`(Intercept)`)) |>  
  na.omit() |> 
  mutate(
    across(.cols = everything(), ~ round(.x, 2))
  )

cor_mat_formatted_hope <- 
  cor_mat_hope |> 
  mutate(
    across(.cols = everything(), ~ cell_spec(.x, bold = ifelse(abs(.x) > 0.5, T, F)))
  )

kbl(
  cor_mat_formatted_hope, 
  escape = F,
  col.names = c("Category", colnames(cor_mat_hope))
  ) |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "100%", fixed_thead = TRUE)
Table 35: Correlation matrix based on hope, empowerment & self-efficacy outcomes only.
Category s_schizo s_oth itt tot qes rct tau tau_wait wait ind_trt rob_low rob_mod rob_high prereg conventional age male dur int FU sess
s_schizo 1 -1 0.2 -0.2 -0.08 0.08 0.13 -0.16 -0.21 0.42 0.53 -0.41 0.01 0.01 -0.01 -0.33 0.52 -0.1 0.03 -0.25 -0.05
s_oth -1 1 -0.2 0.2 0.08 -0.08 -0.13 0.16 0.21 -0.42 -0.53 0.41 -0.01 -0.01 0.01 0.33 -0.52 0.1 -0.03 0.25 0.05
itt 0.2 -0.2 1 -1 0.23 -0.23 0.56 -0.29 -0.37 -0.14 0.56 -0.25 -0.21 -0.02 0.02 -0.3 0.07 0.43 -0.1 -0.06 0.15
tot -0.2 0.2 -1 1 -0.23 0.23 -0.56 0.29 0.37 0.14 -0.56 0.25 0.21 0.02 -0.02 0.3 -0.07 -0.43 0.1 0.06 -0.15
qes -0.08 0.08 0.23 -0.23 1 -1 0.13 -0.07 -0.09 -0.03 -0.08 -0.25 0.37 -0.22 0.22 -0.36 -0.51 0.64 0.35 -0.13 0.93
rct 0.08 -0.08 -0.23 0.23 -1 1 -0.13 0.07 0.09 0.03 0.08 0.25 -0.37 0.22 -0.22 0.36 0.51 -0.64 -0.35 0.13 -0.93
tau 0.13 -0.13 0.56 -0.56 0.13 -0.13 1 -0.52 -0.66 -0.25 0.31 0.03 -0.33 0.34 -0.34 -0.24 0.23 0.05 -0.56 0.09 -0.17
tau_wait -0.16 0.16 -0.29 0.29 -0.07 0.07 -0.52 1 -0.18 -0.07 -0.16 -0.52 0.79 0.31 -0.31 0.02 -0.28 -0.06 0.75 -0.02 0.23
wait -0.21 0.21 -0.37 0.37 -0.09 0.09 -0.66 -0.18 1 -0.09 -0.21 0.35 -0.23 -0.58 0.58 0.27 -0.21 0.01 0.04 -0.03 0.02
ind_trt 0.42 -0.42 -0.14 0.14 -0.03 0.03 -0.25 -0.07 -0.09 1 -0.08 0.13 -0.09 -0.22 0.22 0.02 0.37 -0.03 0.01 -0.13 -0.01
rob_low 0.53 -0.53 0.56 -0.56 -0.08 0.08 0.31 -0.16 -0.21 -0.08 1 -0.59 -0.21 0.36 -0.36 -0.22 0.34 0.36 -0.27 0.1 -0.14
rob_mod -0.41 0.41 -0.25 0.25 -0.25 0.25 0.03 -0.52 0.35 0.13 -0.59 1 -0.66 -0.33 0.33 0.52 0.02 -0.45 -0.45 0.03 -0.39
rob_high 0.01 -0.01 -0.21 0.21 0.37 -0.37 -0.33 0.79 -0.23 -0.09 -0.21 -0.66 1 0.07 -0.07 -0.43 -0.34 0.22 0.8 -0.13 0.6
prereg 0.01 -0.01 -0.02 0.02 -0.22 0.22 0.34 0.31 -0.58 -0.22 0.36 -0.33 0.07 1 -1 0.3 0.04 -0.24 -0.13 0.32 -0.31
conventional -0.01 0.01 0.02 -0.02 0.22 -0.22 -0.34 -0.31 0.58 0.22 -0.36 0.33 -0.07 -1 1 -0.3 -0.04 0.24 0.13 -0.32 0.31
age -0.33 0.33 -0.3 0.3 -0.36 0.36 -0.24 0.02 0.27 0.02 -0.22 0.52 -0.43 0.3 -0.3 1 -0.04 -0.57 -0.08 0.19 -0.38
male 0.52 -0.52 0.07 -0.07 -0.51 0.51 0.23 -0.28 -0.21 0.37 0.34 0.02 -0.34 0.04 -0.04 -0.04 1 -0.19 -0.49 -0.02 -0.57
dur -0.1 0.1 0.43 -0.43 0.64 -0.64 0.05 -0.06 0.01 -0.03 0.36 -0.45 0.22 -0.24 0.24 -0.57 -0.19 1 0.04 0.04 0.61
int 0.03 -0.03 -0.1 0.1 0.35 -0.35 -0.56 0.75 0.04 0.01 -0.27 -0.45 0.8 -0.13 0.13 -0.08 -0.49 0.04 1 -0.27 0.65
FU -0.25 0.25 -0.06 0.06 -0.13 0.13 0.09 -0.02 -0.03 -0.13 0.1 0.03 -0.13 0.32 -0.32 0.19 -0.02 0.04 -0.27 1 -0.22
sess -0.05 0.05 0.15 -0.15 0.93 -0.93 -0.17 0.23 0.02 -0.01 -0.14 -0.39 0.6 -0.31 0.31 -0.38 -0.57 0.61 0.65 -0.22 1

Excluded factors due to no appearance: waitlist-only

Show the code
cor_mat_dat_cat_social <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Social") & test_type != "Raw events") |> 
  select(
    samp = schizophrenia,
    treat = CBT_int,
    test = test_type,
    str = analysis_strategy,
    des = QES_design,
    ctr = control,
    rob = overall_rob,
    pre = prereg_chr
  )

cat_dummy_dat_social <- 
  fastDummies::dummy_cols(cor_mat_dat_cat_social) %>% 
  select(where(is.numeric))


cor_mat_dat_con_social <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Social") & test_type != "Raw events") |> 
  select(
    age = age_mean,
    male = male_pct,
    dur = duration_in_weeks,
    int = sessions_per_week,
    FU = time_after_end_intervention_weeks,
    sess = total_number_of_sessions
  )

cor_mat_dat_social <- 
  bind_cols(cat_dummy_dat_social, cor_mat_dat_con_social) |> 
  select(
    s_schizo = samp_Schizophrenia,
    s_oth = samp_Other,
    cbt_trt = treat_CBT, 
    oth_trt = treat_Other,
    test_clin = `test_Clinician-rated measure`,
    test_self = `test_Self-reported`,
    itt = str_ITT,
    tot = str_TOT,
    qes = des_QES,
    rct = des_RCT,
    tau = ctr_TAU,
    tau_wait = `ctr_TAU with Waiting-list`,
    ind_trt = `ctr_Individual treatment` ,
    rob_low = rob_Low,
    rob_mod = `rob_Some concerns/Moderate`,
    rob_high = `rob_Serious/High`,
    prereg = pre_Preregistered, 
    conventional = `pre_Not preregistered`,
    everything()
  ) |> 
  na.omit()

cor_mat_social <- 
  cor(
    model.matrix(
      reformulate(names(cor_mat_dat_social[,1:ncol(cor_mat_dat_social)])), 
      data = cor_mat_dat_social
      )
  ) |> 
  as.data.frame() |>  
  select(-c(`(Intercept)`)) |> 
  na.omit() |> 
  mutate(
    across(.cols = everything(), ~ round(.x, 2))
  )

cor_mat_formatted_social <- 
  cor_mat_social |> 
  mutate(
    across(.cols = everything(), ~ cell_spec(.x, bold = ifelse(abs(.x) > 0.5, T, F)))
  )

kbl(
  cor_mat_formatted_social, 
  escape = F,
  col.names = c("Category", colnames(cor_mat_social))
  ) |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "100%", fixed_thead = TRUE)
Table 36: Correlation matrix based on social functioning outcomes only.
Category s_schizo s_oth cbt_trt oth_trt test_clin test_self itt tot qes rct tau tau_wait ind_trt rob_low rob_mod rob_high prereg conventional age male dur int FU sess
s_schizo 1 -1 -0.55 0.55 -0.11 0.11 0.44 -0.44 -0.09 0.09 0.11 -0.24 0.26 0.45 -0.34 -0.21 0.3 -0.3 -0.13 0.73 0.71 0.08 0.08 0.71
s_oth -1 1 0.55 -0.55 0.11 -0.11 -0.44 0.44 0.09 -0.09 -0.11 0.24 -0.26 -0.45 0.34 0.21 -0.3 0.3 0.13 -0.73 -0.71 -0.08 -0.08 -0.71
cbt_trt -0.55 0.55 1 -1 0.09 -0.09 -0.35 0.35 -0.14 0.14 0.03 0.03 -0.14 0.14 -0.01 -0.19 0.14 -0.14 0.24 -0.54 -0.6 -0.16 0.01 -0.6
oth_trt 0.55 -0.55 -1 1 -0.09 0.09 0.35 -0.35 0.14 -0.14 -0.03 -0.03 0.14 -0.14 0.01 0.19 -0.14 0.14 -0.24 0.54 0.6 0.16 -0.01 0.6
test_clin -0.11 0.11 0.09 -0.09 1 -1 0.16 -0.16 0.35 -0.35 -0.15 0.19 -0.07 -0.18 0.17 0.04 -0.39 0.39 -0.37 -0.06 0.04 0.19 -0.06 0.15
test_self 0.11 -0.11 -0.09 0.09 -1 1 -0.16 0.16 -0.35 0.35 0.15 -0.19 0.07 0.18 -0.17 -0.04 0.39 -0.39 0.37 0.06 -0.04 -0.19 0.06 -0.15
itt 0.44 -0.44 -0.35 0.35 0.16 -0.16 1 -1 -0.17 0.17 -0.16 0.24 -0.17 -0.04 0.01 0.05 0.32 -0.32 -0.31 0.42 0.25 0.17 -0.16 0.2
tot -0.44 0.44 0.35 -0.35 -0.16 0.16 -1 1 0.17 -0.17 0.16 -0.24 0.17 0.04 -0.01 -0.05 -0.32 0.32 0.31 -0.42 -0.25 -0.17 0.16 -0.2
qes -0.09 0.09 -0.14 0.14 0.35 -0.35 -0.17 0.17 1 -1 0.07 -0.06 -0.02 -0.2 -0.09 0.43 -0.3 0.3 0.03 0.11 0.41 0 0.27 0.36
rct 0.09 -0.09 0.14 -0.14 -0.35 0.35 0.17 -0.17 -1 1 -0.07 0.06 0.02 0.2 0.09 -0.43 0.3 -0.3 -0.03 -0.11 -0.41 0 -0.27 -0.36
tau 0.11 -0.11 0.03 -0.03 -0.15 0.15 -0.16 0.16 0.07 -0.07 1 -0.91 -0.35 0.18 0.26 -0.63 -0.07 0.07 0.63 0.4 -0.03 -0.2 0.34 -0.09
tau_wait -0.24 0.24 0.03 -0.03 0.19 -0.19 0.24 -0.24 -0.06 0.06 -0.91 1 -0.06 -0.25 -0.24 0.69 0.04 -0.04 -0.49 -0.53 -0.15 0.2 -0.31 -0.07
ind_trt 0.26 -0.26 -0.14 0.14 -0.07 0.07 -0.17 0.17 -0.02 0.02 -0.35 -0.06 1 0.12 -0.09 -0.06 0.08 -0.08 -0.41 0.24 0.41 0.02 -0.12 0.39
rob_low 0.45 -0.45 0.14 -0.14 -0.18 0.18 -0.04 0.04 -0.2 0.2 0.18 -0.25 0.12 1 -0.76 -0.47 0.67 -0.67 0.16 0.11 0.35 -0.62 0.19 0.1
rob_mod -0.34 0.34 -0.01 0.01 0.17 -0.17 0.01 -0.01 -0.09 0.09 0.26 -0.24 -0.09 -0.76 1 -0.21 -0.62 0.62 0.12 0.11 -0.44 0.54 -0.14 -0.19
rob_high -0.21 0.21 -0.19 0.19 0.04 -0.04 0.05 -0.05 0.43 -0.43 -0.63 0.69 -0.06 -0.47 -0.21 1 -0.17 0.17 -0.4 -0.32 0.07 0.2 -0.1 0.11
prereg 0.3 -0.3 0.14 -0.14 -0.39 0.39 0.32 -0.32 -0.3 0.3 -0.07 0.04 0.08 0.67 -0.62 -0.17 1 -1 0.17 0.02 0.14 -0.43 -0.05 -0.07
conventional -0.3 0.3 -0.14 0.14 0.39 -0.39 -0.32 0.32 0.3 -0.3 0.07 -0.04 -0.08 -0.67 0.62 0.17 -1 1 -0.17 -0.02 -0.14 0.43 0.05 0.07
age -0.13 0.13 0.24 -0.24 -0.37 0.37 -0.31 0.31 0.03 -0.03 0.63 -0.49 -0.41 0.16 0.12 -0.4 0.17 -0.17 1 0.04 -0.23 -0.07 0.16 -0.22
male 0.73 -0.73 -0.54 0.54 -0.06 0.06 0.42 -0.42 0.11 -0.11 0.4 -0.53 0.24 0.11 0.11 -0.32 0.02 -0.02 0.04 1 0.66 0.3 0.11 0.63
dur 0.71 -0.71 -0.6 0.6 0.04 -0.04 0.25 -0.25 0.41 -0.41 -0.03 -0.15 0.41 0.35 -0.44 0.07 0.14 -0.14 -0.23 0.66 1 -0.05 0.2 0.88
int 0.08 -0.08 -0.16 0.16 0.19 -0.19 0.17 -0.17 0 0 -0.2 0.2 0.02 -0.62 0.54 0.2 -0.43 0.43 -0.07 0.3 -0.05 1 -0.27 0.35
FU 0.08 -0.08 0.01 -0.01 -0.06 0.06 -0.16 0.16 0.27 -0.27 0.34 -0.31 -0.12 0.19 -0.14 -0.1 -0.05 0.05 0.16 0.11 0.2 -0.27 1 0.08
sess 0.71 -0.71 -0.6 0.6 0.15 -0.15 0.2 -0.2 0.36 -0.36 -0.09 -0.07 0.39 0.1 -0.19 0.11 -0.07 0.07 -0.22 0.63 0.88 0.35 0.08 1

Excluded factors due to no appearance: waitlist-only

Show the code
cor_mat_dat_cat_well <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Well") & test_type != "Raw events") |> 
  select(
    samp = schizophrenia,
    treat = CBT_int,
    test = test_type,
    str = analysis_strategy,
    des = QES_design,
    ctr = control,
    rob = overall_rob,
    pre = prereg_chr
  )

cat_dummy_dat_well <- 
  fastDummies::dummy_cols(cor_mat_dat_cat_well) %>% 
  select(where(is.numeric))


cor_mat_dat_con_well <- 
  reintegration_dat |> 
  filter(str_detect(analysis_plan, "Well") & test_type != "Raw events") |> 
  select(
    age = age_mean,
    male = male_pct,
    dur = duration_in_weeks,
    int = sessions_per_week,
    FU = time_after_end_intervention_weeks,
    sess = total_number_of_sessions
  )

cor_mat_dat_well <- 
  bind_cols(cat_dummy_dat_well, cor_mat_dat_con_well) |> 
  select(
    s_schizo = samp_Schizophrenia,
    s_oth = samp_Other,
    cbt_trt = treat_CBT, 
    oth_trt = treat_Other,
    test_clin = `test_Clinician-rated measure`,
    test_self = `test_Self-reported`,
    itt = str_ITT,
    tot = str_TOT,
    qes = des_QES,
    rct = des_RCT,
    tau = ctr_TAU,
    tau_wait = `ctr_TAU with Waiting-list`,
    wait = `ctr_Waiting-list only`,
    ind_trt = `ctr_Individual treatment` ,
    rob_low = rob_Low,
    rob_mod = `rob_Some concerns/Moderate`,
    rob_high = `rob_Serious/High`,
    prereg = pre_Preregistered, 
    conventional = `pre_Not preregistered`,
    everything()
  ) |> 
  na.omit()

cor_mat_well <- 
  cor(
    model.matrix(
      reformulate(names(cor_mat_dat_well[,1:ncol(cor_mat_dat_well)])), 
      data = cor_mat_dat_well
      )
  ) |> 
  as.data.frame() |>  
  select(-c(`(Intercept)`)) |> 
  na.omit() |> 
  mutate(
    across(.cols = everything(), ~ round(.x, 2))
  )

cor_mat_formatted_well <- 
  cor_mat_well |> 
  mutate(
    across(.cols = everything(), ~ cell_spec(.x, bold = ifelse(abs(.x) > 0.5, T, F)))
  )

kbl(
  cor_mat_formatted_well, 
  escape = F,
  col.names = c("Category", colnames(cor_mat_well))
  ) |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "100%", fixed_thead = TRUE)
Table 37: Correlation matrix based on wellbeing and quality of life outcomes only.
Category s_schizo s_oth cbt_trt oth_trt test_clin test_self itt tot qes rct tau tau_wait wait ind_trt rob_low rob_mod rob_high prereg conventional age male dur int FU sess
s_schizo 1 -1 -0.32 0.32 0.17 -0.17 0.22 -0.22 0.07 -0.07 0.18 -0.15 -0.07 -0.05 0.19 -0.28 0.1 -0.03 0.03 -0.36 0.52 0.54 -0.02 0.07 0.51
s_oth -1 1 0.32 -0.32 -0.17 0.17 -0.22 0.22 -0.07 0.07 -0.18 0.15 0.07 0.05 -0.19 0.28 -0.1 0.03 -0.03 0.36 -0.52 -0.54 0.02 -0.07 -0.51
cbt_trt -0.32 0.32 1 -1 -0.09 0.09 -0.28 0.28 -0.01 0.01 0.16 -0.34 0.21 0.15 0.17 -0.04 -0.19 0.14 -0.14 -0.01 -0.72 -0.24 -0.01 0.27 -0.26
oth_trt 0.32 -0.32 -1 1 0.09 -0.09 0.28 -0.28 0.01 -0.01 -0.16 0.34 -0.21 -0.15 -0.17 0.04 0.19 -0.14 0.14 0.01 0.72 0.24 0.01 -0.27 0.26
test_clin 0.17 -0.17 -0.09 0.09 1 -1 -0.12 0.12 0.27 -0.27 0.17 -0.14 -0.06 -0.04 -0.34 0.05 0.4 -0.42 0.42 -0.25 0.24 -0.15 0.1 -0.15 0.04
test_self -0.17 0.17 0.09 -0.09 -1 1 0.12 -0.12 -0.27 0.27 -0.17 0.14 0.06 0.04 0.34 -0.05 -0.4 0.42 -0.42 0.25 -0.24 0.15 -0.1 0.15 -0.04
itt 0.22 -0.22 -0.28 0.28 -0.12 0.12 1 -1 -0.27 0.27 0.44 -0.37 -0.16 -0.12 -0.42 0.54 -0.14 0.03 -0.03 0.03 0.26 0.22 -0.09 -0.05 0.11
tot -0.22 0.22 0.28 -0.28 0.12 -0.12 -1 1 0.27 -0.27 -0.44 0.37 0.16 0.12 0.42 -0.54 0.14 -0.03 0.03 -0.03 -0.26 -0.22 0.09 0.05 -0.11
qes 0.07 -0.07 -0.01 0.01 0.27 -0.27 -0.27 0.27 1 -1 -0.16 -0.12 0.28 0.43 -0.28 -0.09 0.52 -0.55 0.55 -0.11 0.07 -0.14 0.47 -0.17 0.21
rct -0.07 0.07 0.01 -0.01 -0.27 0.27 0.27 -0.27 -1 1 0.16 0.12 -0.28 -0.43 0.28 0.09 -0.52 0.55 -0.55 0.11 -0.07 0.14 -0.47 0.17 -0.21
tau 0.18 -0.18 0.16 -0.16 0.17 -0.17 0.44 -0.44 -0.16 0.16 1 -0.84 -0.37 -0.26 -0.09 0.19 -0.13 -0.06 0.06 -0.05 -0.17 0.18 -0.34 0.26 -0.13
tau_wait -0.15 0.15 -0.34 0.34 -0.14 0.14 -0.37 0.37 -0.12 0.12 -0.84 1 -0.07 -0.05 0.23 -0.3 0.08 0.21 -0.21 -0.05 0.26 -0.13 0.05 -0.22 0
wait -0.07 0.07 0.21 -0.21 -0.06 0.06 -0.16 0.16 0.28 -0.28 -0.37 -0.07 1 -0.02 -0.18 0.24 -0.08 -0.12 0.12 0.31 -0.09 -0.09 0.67 -0.11 0.32
ind_trt -0.05 0.05 0.15 -0.15 -0.04 0.04 -0.12 0.12 0.43 -0.43 -0.26 -0.05 -0.02 1 -0.12 -0.09 0.29 -0.24 0.24 -0.13 -0.05 -0.05 -0.01 -0.05 -0.04
rob_low 0.19 -0.19 0.17 -0.17 -0.34 0.34 -0.42 0.42 -0.28 0.28 -0.09 0.23 -0.18 -0.12 1 -0.73 -0.42 0.52 -0.52 -0.18 -0.13 0.41 -0.31 0.33 -0.01
rob_mod -0.28 0.28 -0.04 0.04 0.05 -0.05 0.54 -0.54 -0.09 0.09 0.19 -0.3 0.24 -0.09 -0.73 1 -0.32 -0.32 0.32 0.33 0.09 -0.27 0.26 -0.27 0.03
rob_high 0.1 -0.1 -0.19 0.19 0.4 -0.4 -0.14 0.14 0.52 -0.52 -0.13 0.08 -0.08 0.29 -0.42 -0.32 1 -0.3 0.3 -0.18 0.06 -0.21 0.08 -0.1 -0.03
prereg -0.03 0.03 0.14 -0.14 -0.42 0.42 0.03 -0.03 -0.55 0.55 -0.06 0.21 -0.12 -0.24 0.52 -0.32 -0.3 1 -1 0.36 -0.37 0.05 -0.35 0.2 -0.27
conventional 0.03 -0.03 -0.14 0.14 0.42 -0.42 -0.03 0.03 0.55 -0.55 0.06 -0.21 0.12 0.24 -0.52 0.32 0.3 -1 1 -0.36 0.37 -0.05 0.35 -0.2 0.27
age -0.36 0.36 -0.01 0.01 -0.25 0.25 0.03 -0.03 -0.11 0.11 -0.05 -0.05 0.31 -0.13 -0.18 0.33 -0.18 0.36 -0.36 1 -0.19 -0.28 0.03 -0.12 -0.14
male 0.52 -0.52 -0.72 0.72 0.24 -0.24 0.26 -0.26 0.07 -0.07 -0.17 0.26 -0.09 -0.05 -0.13 0.09 0.06 -0.37 0.37 -0.19 1 0.39 -0.02 -0.28 0.38
dur 0.54 -0.54 -0.24 0.24 -0.15 0.15 0.22 -0.22 -0.14 0.14 0.18 -0.13 -0.09 -0.05 0.41 -0.27 -0.21 0.05 -0.05 -0.28 0.39 1 -0.15 0.26 0.62
int -0.02 0.02 -0.01 0.01 0.1 -0.1 -0.09 0.09 0.47 -0.47 -0.34 0.05 0.67 -0.01 -0.31 0.26 0.08 -0.35 0.35 0.03 -0.02 -0.15 1 -0.18 0.56
FU 0.07 -0.07 0.27 -0.27 -0.15 0.15 -0.05 0.05 -0.17 0.17 0.26 -0.22 -0.11 -0.05 0.33 -0.27 -0.1 0.2 -0.2 -0.12 -0.28 0.26 -0.18 1 0.03
sess 0.51 -0.51 -0.26 0.26 0.04 -0.04 0.11 -0.11 0.21 -0.21 -0.13 0 0.32 -0.04 -0.01 0.03 -0.03 -0.27 0.27 -0.14 0.38 0.62 0.56 0.03 1
Show the code
cor_mat_dat_cat_mental <- 
  mental_health_dat |> 
  filter(test_type != "Raw events") |> 
  select(
    plan = analysis_plan,
    samp = schizophrenia,
    treat = CBT_int,
    test = test_type,
    str = analysis_strategy,
    des = QES_design,
    ctr = control,
    rob = overall_rob,
    pre = prereg_chr
  )

cat_dummy_dat_mental <- 
  fastDummies::dummy_cols(cor_mat_dat_cat_mental) %>% 
  select(where(is.numeric))


cor_mat_dat_con_mental <- 
  mental_health_dat |>  
  filter(test_type != "Raw events") |> 
  select(
    age = age_mean,
    male = male_pct,
    dur = duration_in_weeks,
    int = sessions_per_week,
    FU = time_after_end_intervention_weeks,
    sess = total_number_of_sessions
  )

cor_mat_dat_mental <- 
  bind_cols(cat_dummy_dat_mental, cor_mat_dat_con_mental) |> 
  select(
    anxiety = plan_Anxiety,
    depress = plan_Depression,
    g_mental = `plan_General mental health`,
    symptoms = `plan_Symptoms of psychosis`,
    s_schizo = samp_Schizophrenia,
    s_oth = samp_Other,
    cbt_trt = treat_CBT, 
    oth_trt = treat_Other,
    test_clin = `test_Clinician-rated measure`,
    test_self = `test_Self-reported`,
    itt = str_ITT,
    tot = str_TOT,
    qes = des_QES,
    rct = des_RCT,
    tau = ctr_TAU,
    tau_wait = `ctr_TAU with Waiting-list`,
    wait = `ctr_Waiting-list only`,
    ind_trt = `ctr_Individual treatment` ,
    rob_low = rob_Low,
    rob_mod = `rob_Some concerns/Moderate`,
    rob_high = `rob_Serious/High`,
    prereg = pre_Preregistered, 
    conventional = `pre_Not preregistered`,
    everything()
  ) |> 
  na.omit()

cor_mat_mental <- 
  cor(
    model.matrix(
      reformulate(names(cor_mat_dat_mental[,1:ncol(cor_mat_dat_mental)])), 
      data = cor_mat_dat_mental
      )
  ) %>% 
  as.data.frame() %>% 
  select(-c(`(Intercept)`)) %>% 
  na.omit() |> 
  mutate(
    
    across(.cols = everything(), ~ round(.x, 2))
  )

cor_mat_formatted_mental <- 
  cor_mat_mental |> 
  mutate(
    across(.cols = everything(), ~ cell_spec(.x, bold = ifelse(abs(.x) > 0.5, T, F)))
  )


kbl(
  cor_mat_formatted_mental, 
  escape = F,
  col.names = c("Category", colnames(cor_mat_mental))
  ) |> 
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    font_size = 10
  ) |> 
  scroll_box(width = "100%", height = "100%", fixed_thead = TRUE)
Table 38: Correlation matrix across all mental health outcomes.
Category anxiety depress g_mental symptoms s_schizo s_oth cbt_trt oth_trt test_clin test_self itt tot qes rct tau tau_wait wait ind_trt rob_low rob_mod rob_high prereg conventional age male dur int FU sess
anxiety 1 -0.2 -0.33 -0.14 -0.09 0.09 0.32 -0.32 -0.11 0.11 -0.14 0.14 -0.05 0.05 -0.16 -0.01 0.25 0.11 0.08 -0.09 0.02 0.09 -0.09 0.22 -0.03 -0.06 -0.07 -0.03 -0.13
depress -0.2 1 -0.58 -0.25 -0.16 0.16 0.04 -0.04 -0.13 0.13 -0.02 0.02 -0.02 0.02 0.09 -0.17 0.09 0.03 -0.15 0.19 -0.07 -0.03 0.03 0.13 -0.11 -0.11 0 0.01 -0.1
g_mental -0.33 -0.58 1 -0.41 -0.11 0.11 -0.08 0.08 -0.1 0.1 0.19 -0.19 -0.15 0.15 -0.15 0.29 -0.16 -0.05 0.1 -0.03 -0.06 0.19 -0.19 -0.27 -0.12 0.01 -0.01 -0.01 0.01
symptoms -0.14 -0.25 -0.41 1 0.43 -0.43 -0.21 0.21 0.39 -0.39 -0.13 0.13 0.27 -0.27 0.23 -0.18 -0.1 -0.06 -0.01 -0.11 0.16 -0.29 0.29 0.03 0.33 0.17 0.08 0.03 0.22
s_schizo -0.09 -0.16 -0.11 0.43 1 -1 -0.2 0.2 0 0 0.12 -0.12 0.07 -0.07 0.09 -0.12 -0.06 0.15 0.35 -0.31 0.01 0.12 -0.12 -0.18 0.34 0.46 -0.06 0.04 0.31
s_oth 0.09 0.16 0.11 -0.43 -1 1 0.2 -0.2 0 0 -0.12 0.12 -0.07 0.07 -0.09 0.12 0.06 -0.15 -0.35 0.31 -0.01 -0.12 0.12 0.18 -0.34 -0.46 0.06 -0.04 -0.31
cbt_trt 0.32 0.04 -0.08 -0.21 -0.2 0.2 1 -1 0.01 -0.01 -0.02 0.02 -0.08 0.08 -0.12 -0.1 0.33 0.11 0.09 -0.03 -0.06 0.13 -0.13 0.17 -0.08 -0.32 0.15 0.13 -0.24
oth_trt -0.32 -0.04 0.08 0.21 0.2 -0.2 -1 1 -0.01 0.01 0.02 -0.02 0.08 -0.08 0.12 0.1 -0.33 -0.11 -0.09 0.03 0.06 -0.13 0.13 -0.17 0.08 0.32 -0.15 -0.13 0.24
test_clin -0.11 -0.13 -0.1 0.39 0 0 0.01 -0.01 1 -1 0.03 -0.03 0.05 -0.05 0.24 -0.28 0.07 -0.1 -0.27 0.22 0.01 -0.25 0.25 0.15 0.08 -0.07 0.04 -0.01 0.03
test_self 0.11 0.13 0.1 -0.39 0 0 -0.01 0.01 -1 1 -0.03 0.03 -0.05 0.05 -0.24 0.28 -0.07 0.1 0.27 -0.22 -0.01 0.25 -0.25 -0.15 -0.08 0.07 -0.04 0.01 -0.03
itt -0.14 -0.02 0.19 -0.13 0.12 -0.12 -0.02 0.02 0.03 -0.03 1 -1 -0.19 0.19 0.33 -0.19 -0.23 -0.15 -0.2 0.26 -0.1 0.27 -0.27 -0.32 -0.22 0.16 -0.14 0.03 0.03
tot 0.14 0.02 -0.19 0.13 -0.12 0.12 0.02 -0.02 -0.03 0.03 -1 1 0.19 -0.19 -0.33 0.19 0.23 0.15 0.2 -0.26 0.1 -0.27 0.27 0.32 0.22 -0.16 0.14 -0.03 -0.03
qes -0.05 -0.02 -0.15 0.27 0.07 -0.07 -0.08 0.08 0.05 -0.05 -0.19 0.19 1 -1 0 -0.16 0.11 0.25 -0.22 -0.33 0.67 -0.44 0.44 -0.08 0.03 0.15 0.39 -0.13 0.42
rct 0.05 0.02 0.15 -0.27 -0.07 0.07 0.08 -0.08 -0.05 0.05 0.19 -0.19 -1 1 0 0.16 -0.11 -0.25 0.22 0.33 -0.67 0.44 -0.44 0.08 -0.03 -0.15 -0.39 0.13 -0.42
tau -0.16 0.09 -0.15 0.23 0.09 -0.09 -0.12 0.12 0.24 -0.24 0.33 -0.33 0 0 1 -0.79 -0.42 -0.27 -0.16 0.31 -0.22 -0.08 0.08 -0.07 -0.05 0.08 -0.21 0.24 -0.04
tau_wait -0.01 -0.17 0.29 -0.18 -0.12 0.12 -0.1 0.1 -0.28 0.28 -0.19 0.19 -0.16 0.16 -0.79 1 -0.1 -0.06 0.25 -0.41 0.25 0.17 -0.17 -0.2 0.03 -0.11 -0.02 -0.16 -0.08
wait 0.25 0.09 -0.16 -0.1 -0.06 0.06 0.33 -0.33 0.07 -0.07 -0.23 0.23 0.11 -0.11 -0.42 -0.1 1 -0.03 -0.13 0.2 -0.11 -0.07 0.07 0.55 0 -0.1 0.46 -0.14 0.12
ind_trt 0.11 0.03 -0.05 -0.06 0.15 -0.15 0.11 -0.11 -0.1 0.1 -0.15 0.15 0.25 -0.25 -0.27 -0.06 -0.03 1 0.03 -0.17 0.18 -0.08 0.08 -0.14 0.06 0.2 -0.03 -0.06 0.13
rob_low 0.08 -0.15 0.1 -0.01 0.35 -0.35 0.09 -0.09 -0.27 0.27 -0.2 0.2 -0.22 0.22 -0.16 0.25 -0.13 0.03 1 -0.66 -0.28 0.49 -0.49 0.02 0.1 0.3 -0.24 0.19 -0.02
rob_mod -0.09 0.19 -0.03 -0.11 -0.31 0.31 -0.03 0.03 0.22 -0.22 0.26 -0.26 -0.33 0.33 0.31 -0.41 0.2 -0.17 -0.66 1 -0.54 -0.22 0.22 0.13 -0.05 -0.31 0.16 -0.05 -0.15
rob_high 0.02 -0.07 -0.06 0.16 0.01 -0.01 -0.06 0.06 0.01 -0.01 -0.1 0.1 0.67 -0.67 -0.22 0.25 -0.11 0.18 -0.28 -0.54 1 -0.27 0.27 -0.19 -0.05 0.07 0.07 -0.14 0.22
prereg 0.09 -0.03 0.19 -0.29 0.12 -0.12 0.13 -0.13 -0.25 0.25 0.27 -0.27 -0.44 0.44 -0.08 0.17 -0.07 -0.08 0.49 -0.22 -0.27 1 -1 0.2 -0.22 0.01 -0.26 0.1 -0.24
conventional -0.09 0.03 -0.19 0.29 -0.12 0.12 -0.13 0.13 0.25 -0.25 -0.27 0.27 0.44 -0.44 0.08 -0.17 0.07 0.08 -0.49 0.22 0.27 -1 1 -0.2 0.22 -0.01 0.26 -0.1 0.24
age 0.22 0.13 -0.27 0.03 -0.18 0.18 0.17 -0.17 0.15 -0.15 -0.32 0.32 -0.08 0.08 -0.07 -0.2 0.55 -0.14 0.02 0.13 -0.19 0.2 -0.2 1 0.05 -0.21 0.1 -0.09 -0.1
male -0.03 -0.11 -0.12 0.33 0.34 -0.34 -0.08 0.08 0.08 -0.08 -0.22 0.22 0.03 -0.03 -0.05 0.03 0 0.06 0.1 -0.05 -0.05 -0.22 0.22 0.05 1 0.1 0 -0.14 0
dur -0.06 -0.11 0.01 0.17 0.46 -0.46 -0.32 0.32 -0.07 0.07 0.16 -0.16 0.15 -0.15 0.08 -0.11 -0.1 0.2 0.3 -0.31 0.07 0.01 -0.01 -0.21 0.1 1 -0.15 0.18 0.72
int -0.07 0 -0.01 0.08 -0.06 0.06 0.15 -0.15 0.04 -0.04 -0.14 0.14 0.39 -0.39 -0.21 -0.02 0.46 -0.03 -0.24 0.16 0.07 -0.26 0.26 0.1 0 -0.15 1 -0.17 0.43
FU -0.03 0.01 -0.01 0.03 0.04 -0.04 0.13 -0.13 -0.01 0.01 0.03 -0.03 -0.13 0.13 0.24 -0.16 -0.14 -0.06 0.19 -0.05 -0.14 0.1 -0.1 -0.09 -0.14 0.18 -0.17 1 -0.02
sess -0.13 -0.1 0.01 0.22 0.31 -0.31 -0.24 0.24 0.03 -0.03 0.03 -0.03 0.42 -0.42 -0.04 -0.08 0.12 0.13 -0.02 -0.15 0.22 -0.24 0.24 -0.1 0 0.72 0.43 -0.02 1

Standard Errors and Other Auxiliary Data

SE forest plot

This forest plot shows the within- and between study variation of standard error of effect size estimates for reintegrational outcomes.

Show the code
reintegration_dat |> 
  arrange(desc(study)) |>
  mutate(
    study = factor(study, unique(study)),
    segt_pop = sqrt(vgt_pop)
    ) |> 
  ggplot(aes(x = segt_pop, y = study, color = study)) +
  geom_point(aes(size = N_total), alpha = 0.5) +
  scale_y_discrete() +
  theme_minimal() +
  labs(y = "", x = "SE") +
  theme(legend.position = "none", axis.text.y = element_text(size = 10))
Figure 83: Forest plot of standard error of reintegrational effect size estimates.
Show the code
mental_health_dat |> 
  arrange(desc(study)) |>
  mutate(
    study = factor(study, unique(study)),
    segt_pop = sqrt(vgt_pop)
    ) |> 
  ggplot(aes(x = segt_pop, y = study, color = study)) +
  geom_point(aes(size = N_total), alpha = 0.5) +
  scale_y_discrete() +
  theme_minimal() +
  labs(y = "", x = "SE") +
  theme(legend.position = "none", axis.text.y = element_text(size = 10))
Figure 84: Forest plot of standard error of mental health effect size estimates.

Modified SE forest plot

Show the code
reintegration_dat |> 
  arrange(desc(study)) |>
  mutate(
    study = factor(study, unique(study)),
    Wse_pop = sqrt(Wgt_pop)
    ) |> 
  ggplot(aes(x = Wse_pop, y = study, color = study)) +
  geom_point(aes(size = N_total), alpha = 0.5, position = position_jitter(height = 0.4)) +
  scale_y_discrete() +
  theme_minimal() +
  labs(y = "", x = "Modified SE") +
  theme(legend.position = "none", axis.text.y = element_text(size = 10))
Figure 85: Forest plot of modified standard error of reintegrational effect size estimates.
Show the code
mental_health_dat |> 
  arrange(desc(study)) |>
  mutate(
    study = factor(study, unique(study)),
    Wse_pop = sqrt(Wgt_pop)
    ) |> 
  ggplot(aes(x = Wse_pop, y = study, color = study)) +
  geom_point(aes(size = N_total), alpha = 0.5, position = position_jitter(height = 0.4)) +
  scale_y_discrete() +
  theme_minimal() +
  labs(y = "", x = "Modified SE") +
  theme(legend.position = "none", axis.text.y = element_text(size = 10))
Figure 86: Forest plot of modified standard error of mental health effect size estimates.

Inverse sampling covariance weights plot

Show the code
iscw <-
  function(k, rho, v) {
    iscw_weights <-  k / (((k - 1) * rho + 1) * v)
    return(iscw_weights)
  }

rho_val <- round(seq(0, 0.8, 0.2), 1)

ISCW_plot <- 
  reintegration_dat |> 
  expand_grid(rho = rho_val) |> 
  group_by(study, rho) |> 
  summarise(
    k = n(),
    v_bar = mean(vgt_pop)
  ) |> 
  ungroup() |> 
  mutate(iscw_w = iscw(k, rho, v_bar),
         depd = ifelse(k > 1, 1, 0)) |> 
  group_by(rho) |> 
  mutate(iscw_w_norm = iscw_w / sum(iscw_w)) |> 
  ungroup() |> 
  distinct(study, rho, iscw_w_norm, depd) |> 
  mutate(study = factor(study, levels = study[rho == 0.8][order(iscw_w_norm[rho == 0.8])])) |> 
  ggplot(aes(y = iscw_w_norm, x = study, group = factor(rho), colour = factor(rho))) +
  geom_point() +
  geom_line() + 
  theme_minimal() +
  coord_flip() +
  theme(
    legend.position = "inside",
    legend.position.inside = c(0.8, 0.2)
  ) +
  labs(x = "", y = "Normalized Weight", colour = "Assumed Correlation") 

ISCW_plot
Figure 87: Plot of inverse sampling covariance (ISC) weights for each study (reintegrational outcomes)
Show the code
ISCW_plot_mental <- 
  mental_health_dat |> 
  expand_grid(rho = rho_val) |> 
  group_by(study, rho) |> 
  summarise(
    k = n(),
    v_bar = mean(vgt_pop)
  ) |> 
  ungroup() |> 
  mutate(iscw_w = iscw(k, rho, v_bar),
         depd = ifelse(k > 1, 1, 0)) |> 
  group_by(rho) |> 
  mutate(iscw_w_norm = iscw_w / sum(iscw_w)) |> 
  ungroup() |> 
  distinct(study, rho, iscw_w_norm, depd) |> 
  mutate(study = factor(study, levels = study[rho == 0.8][order(iscw_w_norm[rho == 0.8])])) |> 
  ggplot(aes(y = iscw_w_norm, x = study, group = factor(rho), colour = factor(rho))) +
  geom_point() +
  geom_line() + 
  theme_minimal() +
  coord_flip() +
  theme(
    legend.position = "inside",
    legend.position.inside = c(0.85, 0.2)
  ) +
  labs(x = "", y = "Normalized Weight", colour = "Assumed Correlation") 

ISCW_plot_mental
Figure 88: Plot of inverse sampling covariance (ISC) weights for each study (mental healt outcomes)

Study sample sizes versus standard error estimates

Show the code
reintegration_dat |> 
  mutate(segt_pop = sqrt(vgt_pop)) |> 
  ggplot(aes(N_total, segt_pop)) + 
  geom_point() +
  geom_smooth() +
  theme_bw() +
  labs(x = "Total sample size", y = "Modified standard error")
Figure 89: Study sample sizes versus reintegrational standard error estimates
Show the code
mental_health_dat |> 
  mutate(segt_pop = sqrt(vgt_pop)) |> 
  ggplot(aes(N_total, segt_pop)) + 
  geom_point() +
  geom_smooth() +
  theme_bw() +
  labs(x = "Total sample size", y = "Modified standard error")
Figure 90: Study sample sizes versus mental health standard error estimates

Standard error vs. scaled standrad error

Show the code
reintegration_dat |> 
  mutate(
    sample_above_100 = if_else(N_total >100, "Sample > 100", "Sample < 100"),
    sample_above_100 = factor(sample_above_100, levels = c( "Sample > 100", "Sample < 100")),
    segt_pop = sqrt(vgt_pop),
    diff_se = sqrt(Wgt_pop) - sqrt(vgt_pop)
  ) |> 
  ggplot(aes(gt_pop, diff_se, color = sample_above_100)) + 
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  theme_bw() +
  theme(
    plot.caption=element_text(hjust = 0, size = 10),
    legend.position= "bottom",
    legend.title = element_blank(),
    panel.spacing.x = unit(5, "mm"), 
    panel.spacing.y = unit(5, "mm"),
    #panel.grid.major = element_blank(),
    #panel.grid.minor = element_blank()
  ) +
  scale_x_continuous(expand=c(0,0), breaks = seq(-1L, 1.5, 0.2)) + 
  scale_y_continuous(expand=c(0,0), breaks = seq(-0.1, 0.1, 0.01)) + 
  expand_limits(x = c(-0.6, 1.5), y = c(-0.041, 0.01)) +
  labs(y = "Modified SE - SE (used in main analysis)", x = "Effect size estimate")
Figure 91: Standard error vs. modified standard errors (reintegration)
Show the code
mental_health_dat |> 
  mutate(
    sample_above_100 = if_else(N_total >100, "Sample > 100", "Sample < 100"),
    sample_above_100 = factor(sample_above_100, levels = c( "Sample > 100", "Sample < 100")),
    segt_pop = sqrt(vgt_pop),
    diff_se = sqrt(Wgt_pop) - sqrt(vgt_pop)
  ) |> 
  ggplot(aes(gt_pop, diff_se, color = sample_above_100)) + 
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  theme_bw() +
  theme(
    plot.caption=element_text(hjust = 0, size = 10),
    legend.position= "bottom",
    legend.title = element_blank(),
    panel.spacing.x = unit(5, "mm"), 
    panel.spacing.y = unit(5, "mm"),
    #panel.grid.major = element_blank(),
    #panel.grid.minor = element_blank()
  ) +
  scale_x_continuous(expand=c(0,0), breaks = seq(-1L, 2, 0.2)) + 
  scale_y_continuous(expand=c(0,0), breaks = seq(-0.1, 0.1, 0.01)) + 
  expand_limits(x = c(-0.71, 2), y = c(-0.091, 0.01)) +
  labs(y = "Modified SE - SE (used in main analysis)", x = "Effect size estimate")
Figure 92: Standard error vs. modified standard errors (mental health outcomes)

Effect size estimates distributions and outliers

Marginal distributions

Show the code
reintegration_dat$gt_pop |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) |>
  knitr::kable(
    digits = 2,
    caption = "Marginal distribution of effect size estimates",
    booktabs = TRUE
  )  |> 
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Marginal distribution of effect size estimates
mean sd p0 p25 p50 p75 p100
0.21 0.28 -0.5 0.03 0.18 0.38 1.35
Show the code
mental_health_dat$gt_pop |> 
  skim() |>
  select(-skim_type, -skim_variable, -n_missing, -complete_rate, -numeric.hist) |>
  rename_at(vars(starts_with("numeric.")), ~ str_remove(., "numeric\\.")) |>
  knitr::kable(
    digits = 2,
    caption = "Marginal distribution of effect size estimates",
    booktabs = TRUE
  )  |> 
  kable_styling(bootstrap_options = c("striped","condensed"), full_width = FALSE)
Marginal distribution of effect size estimates
mean sd p0 p25 p50 p75 p100
0.28 0.39 -0.64 0.02 0.21 0.53 1.8

Marginal distribution plots

Show the code
qrtls <- quantile(reintegration_dat$gt_pop, c(.25, .75), na.rm = TRUE)
fences <-  qrtls + 3 * diff(qrtls) * c(-1, 1)
fence_dat <- data.frame(qrtl = qrtls, fence = fences)

es_dist_plot <- 
  ggplot(reintegration_dat, aes(gt_pop)) + 
  geom_density(fill = "cornflowerblue", alpha = 0.8) + 
  geom_vline(data = fence_dat, aes(xintercept = qrtl), linetype = "solid") + 
  geom_vline(data = fence_dat, aes(xintercept = fence), linetype = "dashed") + 
  geom_rug(alpha = 0.25) + 
  theme_minimal() + 
  theme(axis.title.y = element_blank()) +
  labs(x = "Effect size estimate")

es_dist_plot
Figure 93: Empirical distribution of reintegrational effect size estimates. Solid vertical lines indicate lower and upper quartiles. Dashed lines indicate the 1st quartile minus 3 times the inter-quartile range and the 3rd quartile plus 3 times the interquartile range. Effect sizes outside of the range of dashed lines would be considered outliers according to Tukey’s (1977) definition.
Show the code
qrtls_mental <- quantile(mental_health_dat$gt_pop, c(.25, .75), na.rm = TRUE)
fences_mental <-  qrtls_mental + 3 * diff(qrtls_mental) * c(-1, 1)
fence_dat_mental <- data.frame(qrtl = qrtls_mental, fence = fences_mental)

es_dist_plot_mental <- 
  ggplot(mental_health_dat, aes(gt_pop)) + 
  geom_density(fill = "gray", alpha = 0.8) + 
  geom_vline(data = fence_dat_mental, aes(xintercept = qrtl), linetype = "solid") + 
  geom_vline(data = fence_dat_mental, aes(xintercept = fence), linetype = "dashed") + 
  geom_rug(alpha = 0.25) + 
  theme_minimal() + 
  theme(axis.title.y = element_blank()) +
  labs(x = "Effect size estimate")

es_dist_plot_mental
Figure 94: Empirical distribution of mental health effect size estimates. Solid vertical lines indicate lower and upper quartiles. Dashed lines indicate the 1st quartile minus 3 times the inter-quartile range and the 3rd quartile plus 3 times the interquartile range. Effect sizes outside of the range of dashed lines would be considered outliers according to Tukey’s (1977) definition.

Effect size distribution across type of outcomes

Show the code
outcomes_reint_dat <- 
  reintegration_dat |> 
  filter(!str_detect(analysis_plan, "Psychiatric")) |> 
  group_by(analysis_plan) |> 
  reframe(
    qrtl = quantile(gt,  c(.25, .75)),
    fence = qrtl + 3 * diff(qrtl) * c(-1,1),
    .groups = "drop"
  )


reintegration_outcome_plot <- 
  reintegration_dat |> 
  #Has only one data point
  filter(!str_detect(analysis_plan, "Psychiatric")) |> 
  ggplot(aes(x = gt_pop, fill = analysis_plan)) + 
  geom_density(alpha = 0.7) +
  geom_vline(data = outcomes_reint_dat, aes(xintercept = qrtl), linetype = "solid")+
  geom_vline(data = outcomes_reint_dat, aes(xintercept = fence), linetype = "dashed")+
  geom_rug(alpha = 0.25) +
  facet_wrap(~analysis_plan, ncol = 2) +
  theme_minimal() +
  theme(legend.position = "none", axis.title.y = element_blank(), axis.text.y = element_blank()) +
  labs(x = "Effect size estimate", ); reintegration_outcome_plot
Figure 95: Empirical distribution of effect size estimates, by reintegrational constructs
Show the code
outcome_mental_health_dat <- 
  mental_health_dat |> 
  group_by(analysis_plan) |> 
  reframe(
    qrtl = quantile(gt,  c(.25, .75)),
    fence = qrtl + 3 * diff(qrtl) * c(-1,1),
    
    .groups = "drop"
  )

mental_health_outcomes_plot <- 
  mental_health_dat |> 
  ggplot(aes(x = gt_pop, fill = analysis_plan)) + 
  geom_density(alpha = 0.7) +
  geom_vline(data = outcome_mental_health_dat, aes(xintercept = qrtl), linetype = "solid")+
  geom_vline(data = outcome_mental_health_dat, aes(xintercept = fence), linetype = "dashed")+
  geom_rug(alpha = 0.25) +
  facet_wrap(~analysis_plan, scales = "free") +
  theme_minimal() +
  theme(legend.position = "none", axis.title.y = element_blank(), axis.text = element_blank()) +
  labs(x = "Effect size estimate"); mental_health_outcomes_plot
Figure 96: Empirical distribution of effect size estimates, by mental health constructs

Colophon

Session Information
─ Session info ───────────────────────────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.5.1 (2025-06-13 ucrt)
 os       Windows 11 x64 (build 22631)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  Danish_Denmark.utf8
 ctype    Danish_Denmark.utf8
 tz       Europe/Copenhagen
 date     2025-09-25
 pandoc   3.6.3 @ C:/RStudio-2025.09.0-387/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
 quarto   NA @ C:\\RSTUDI~1.0-3\\RESOUR~1\\app\\bin\\quarto\\bin\\quarto.exe

─ Packages ───────────────────────────────────────────────────────────────────────────────────────
 package      * version    date (UTC) lib source
 base64enc      0.1-3      2015-07-28 [1] CRAN (R 4.5.0)
 cli            3.6.5      2025-04-23 [1] CRAN (R 4.5.1)
 clubSandwich * 0.6.1      2025-07-30 [1] CRAN (R 4.5.1)
 data.table     1.17.8     2025-07-10 [1] CRAN (R 4.5.1)
 digest         0.6.37     2024-08-19 [1] CRAN (R 4.5.1)
 dplyr        * 1.1.4      2023-11-17 [1] CRAN (R 4.5.1)
 evaluate       1.0.5      2025-08-27 [1] CRAN (R 4.5.1)
 farver         2.1.2      2024-05-13 [1] CRAN (R 4.5.1)
 fastDummies  * 1.7.5      2025-01-20 [1] CRAN (R 4.5.1)
 fastmap        1.2.0      2024-05-15 [1] CRAN (R 4.5.1)
 forcats      * 1.0.0      2023-01-29 [1] CRAN (R 4.5.1)
 generics       0.1.4      2025-05-09 [1] CRAN (R 4.5.1)
 GGally       * 2.4.0      2025-08-23 [1] CRAN (R 4.5.1)
 ggExtra      * 0.11.0     2025-09-01 [1] CRAN (R 4.5.1)
 ggh4x        * 0.3.1      2025-05-30 [1] CRAN (R 4.5.1)
 ggplot2      * 4.0.0      2025-09-11 [1] CRAN (R 4.5.1)
 ggrepel      * 0.9.6      2024-09-07 [1] CRAN (R 4.5.1)
 ggridges     * 0.5.7      2025-08-27 [1] CRAN (R 4.5.1)
 ggstats        0.11.0     2025-09-15 [1] CRAN (R 4.5.1)
 glue           1.8.0      2024-09-30 [1] CRAN (R 4.5.1)
 gtable         0.3.6      2024-10-25 [1] CRAN (R 4.5.1)
 hms            1.1.3      2023-03-21 [1] CRAN (R 4.5.1)
 htmltools      0.5.8.1    2024-04-04 [1] CRAN (R 4.5.1)
 htmlwidgets    1.6.4      2023-12-06 [1] CRAN (R 4.5.1)
 httpuv         1.6.16     2025-04-16 [1] CRAN (R 4.5.1)
 igraph       * 2.1.4      2025-01-23 [1] CRAN (R 4.5.1)
 janitor      * 2.2.1      2024-12-22 [1] CRAN (R 4.5.1)
 jsonlite       2.0.0      2025-03-27 [1] CRAN (R 4.5.1)
 kableExtra   * 1.4.0      2024-01-24 [1] CRAN (R 4.5.1)
 knitr        * 1.50       2025-03-16 [1] CRAN (R 4.5.1)
 labeling       0.4.3      2023-08-29 [1] CRAN (R 4.5.0)
 later          1.4.4      2025-08-27 [1] CRAN (R 4.5.1)
 lattice        0.22-7     2025-04-02 [1] CRAN (R 4.5.1)
 lifecycle      1.0.4      2023-11-07 [1] CRAN (R 4.5.1)
 lubridate    * 1.9.4      2024-12-08 [1] CRAN (R 4.5.1)
 magrittr       2.0.4      2025-09-12 [1] CRAN (R 4.5.1)
 mathjaxr       1.8-0      2025-04-30 [1] CRAN (R 4.5.1)
 Matrix       * 1.7-3      2025-03-11 [1] CRAN (R 4.5.1)
 metadat      * 1.4-0      2025-02-04 [1] CRAN (R 4.5.1)
 metafor      * 4.9-18     2025-09-22 [1] Github (wviechtb/metafor@6cc5a0a)
 MetBrewer    * 0.2.0      2022-03-21 [1] CRAN (R 4.5.1)
 mgcv           1.9-3      2025-04-04 [1] CRAN (R 4.5.1)
 mime           0.13       2025-03-17 [1] CRAN (R 4.5.0)
 miniUI         0.1.2      2025-04-17 [1] CRAN (R 4.5.1)
 nlme           3.1-168    2025-03-31 [1] CRAN (R 4.5.1)
 numDeriv     * 2016.8-1.1 2019-06-06 [1] CRAN (R 4.5.0)
 patchwork    * 1.3.2      2025-08-25 [1] CRAN (R 4.5.1)
 pillar         1.11.1     2025-09-17 [1] CRAN (R 4.5.1)
 pkgconfig      2.0.3      2019-09-22 [1] CRAN (R 4.5.1)
 promises       1.3.3      2025-05-29 [1] CRAN (R 4.5.1)
 purrr        * 1.1.0      2025-07-10 [1] CRAN (R 4.5.1)
 R6             2.6.1      2025-02-15 [1] CRAN (R 4.5.1)
 RColorBrewer   1.1-3      2022-04-03 [1] CRAN (R 4.5.0)
 Rcpp           1.1.0      2025-07-02 [1] CRAN (R 4.5.1)
 readr        * 2.1.5      2024-01-10 [1] CRAN (R 4.5.1)
 repr           1.1.7      2024-03-22 [1] CRAN (R 4.5.1)
 rlang        * 1.1.6      2025-04-11 [1] CRAN (R 4.5.1)
 rmarkdown      2.29       2024-11-04 [1] CRAN (R 4.5.1)
 rstudioapi     0.17.1     2024-10-22 [1] CRAN (R 4.5.1)
 S7             0.2.0      2024-11-07 [1] CRAN (R 4.5.1)
 sandwich       3.1-1      2024-09-15 [1] CRAN (R 4.5.1)
 scales         1.4.0      2025-04-24 [1] CRAN (R 4.5.1)
 sessioninfo    1.2.3      2025-02-05 [1] CRAN (R 4.5.1)
 shiny          1.11.1     2025-07-03 [1] CRAN (R 4.5.1)
 skimr        * 2.2.1      2025-07-26 [1] CRAN (R 4.5.1)
 snakecase      0.11.1     2023-08-27 [1] CRAN (R 4.5.1)
 stringi        1.8.7      2025-03-27 [1] CRAN (R 4.5.0)
 stringr      * 1.5.2      2025-09-08 [1] CRAN (R 4.5.1)
 svglite        2.2.1      2025-05-12 [1] CRAN (R 4.5.1)
 systemfonts    1.2.3      2025-04-30 [1] CRAN (R 4.5.1)
 textshaping    1.0.3      2025-09-02 [1] CRAN (R 4.5.1)
 tibble       * 3.3.0      2025-06-08 [1] CRAN (R 4.5.1)
 tidyr        * 1.3.1      2024-01-24 [1] CRAN (R 4.5.1)
 tidyselect     1.2.1      2024-03-11 [1] CRAN (R 4.5.1)
 tidyverse    * 2.0.0      2023-02-22 [1] CRAN (R 4.5.1)
 timechange     0.3.0      2024-01-18 [1] CRAN (R 4.5.1)
 tzdb           0.5.0      2025-03-15 [1] CRAN (R 4.5.1)
 utf8           1.2.6      2025-06-08 [1] CRAN (R 4.5.1)
 vctrs          0.6.5      2023-12-01 [1] CRAN (R 4.5.1)
 viridisLite    0.4.2      2023-05-02 [1] CRAN (R 4.5.1)
 withr          3.0.2      2024-10-28 [1] CRAN (R 4.5.1)
 xfun           0.53       2025-08-19 [1] CRAN (R 4.5.1)
 xml2           1.4.0      2025-08-20 [1] CRAN (R 4.5.1)
 xtable         1.8-4      2019-04-21 [1] CRAN (R 4.5.1)
 yaml           2.3.10     2024-07-26 [1] CRAN (R 4.5.0)
 zoo            1.8-14     2025-04-10 [1] CRAN (R 4.5.1)

 [1] C:/Users/B199526/AppData/Local/Programs/R/R-4.5.1/library
 * ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────────────────────────